飞污熊博客

静下心来做一件事

SSL/TLS 证书是用于用户浏览器和网站服务器之间的数据传输加密,实现互联网传输安全保护,大多数情况下指的是服务器证书。 服务器证书是用于向浏览器客户端验证服务器,这种是属于单向认证的SSL证书。但是,如果服务器需要对客户端进行身份验证, 该怎么办?这就需要双向认证证书。

为什么需要另一种认证方式的证书?因为当同时使用两种认证方式的证书时,有助于双方(即客户端和服务器端)之间的相互认证。 另外,与标准SSL证书不同的是,双向认证的SSL证书实际上被称作为个人认证证书(PAC)。

双向认证流程图如下: img.png

  1. 客户端发起建立HTTPS连接请求,将SSL协议版本的信息发送给服务端;
  2. 服务器端将本机的公钥证书(server.crt)发送给客户端;
  3. 客户端读取公钥证书(server.crt),取出了服务端公钥;
  4. 客户端将客户端公钥证书(client.crt)发送给服务器端;
  5. 服务器端使用根证书(root.crt)解密客户端公钥证书,拿到客户端公钥;
  6. 客户端发送自己支持的加密方案给服务器端;
  7. 服务器端根据自己和客户端的能力,选择一个双方都能接受的加密方案,使用客户端的公钥加密后发送给客户端;
  8. 客户端使用自己的私钥解密加密方案,生成一个随机数R,使用服务器公钥加密后传给服务器端;
  9. 服务端用自己的私钥去解密这个密文,得到了密钥R
  10. 服务端和客户端在后续通讯过程中就使用这个密钥R进行通信了。

本篇直接通过代码演示如何在Java实现证书的双向认证。

阅读全文 »

密码学领域有对称加密和非对称加密算法,本篇将使用Java语言来实现几种常见的加解密算法。

完整源码请参考 GitHub源码

对称加密算法概念

加密密钥和解密密钥相同,大部分算法加密揭秘过程互逆。

特点:算法公开、(相比非对称加密)计算量小、加密速度快、效率高。

弱点:双方都使用同样的密钥,安全性得不到保证。

常用对称加密算法

  • DES(Data Encryption Standard)
  • 3DES(DES加强版,使用3次DES计算,Triple DES,DESede)
  • AES(Advanced Encryption Standard,3DES加强版)

这里只列出最常用的AES算法实现,也是安全等级最高,推荐使用的对称加密算法,其他实现请参考我的GitHub上的源码。

阅读全文 »

环境配置

1.修改openssl配置文件

通过vi编辑文件/etc/pki/tls/openssl.cnf,更新内容如下,有的部分是更新,有的是增加。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[ CA_default ]
req_extensions = v3_req

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth

[ v3_server_client ]
basicConstraints = critical, CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always, issuer:always
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment, keyAgreement
extendedKeyUsage = critical, serverAuth, clientAuth
crlDistributionPoints = URI:https://example.com/xxx.crl

[ v3_sign ]
basicConstraints = critical, CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always, issuer:always
keyUsage = critical, digitalSignature
extendedKeyUsage = critical, codeSigning

[ v3_ca ]
basicConstraints = critical, CA:true
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
keyUsage = critical, cRLSign, digitalSignature, keyCertSign
crlDistributionPoints=URI:https://example.com/root.crl

[ crl_ext ]
authorityKeyIdentifier=keyid:always, issuer:always

**强烈提醒:**如果是要做客户端证书认证,证书类型一定要选v3_server_client

X.509 v3证书定义的扩展为用户或公钥以及在CA间的管理提供了额外的功能。X.509 v3证书的格式允许组织使用私有的扩展。 证书中的扩展被定义为criticalnon-critical。 一个使用证书的系统在接收到设置为critical但无法识别或无法处理的证书时,必须拒绝处理该证书。 一个non-critical的证书在无法识别时可能会被忽略。

  • 约束1:主机已经安装了OpenSSL,版本号1.0.2
  • 约束2:生成CA根证书前,请提前规划以下环境配置参数。
    阅读全文 »

CipherSuite这个名词目前没看到有好的中文翻译,个人觉得翻译成加密算法套件比较合适。 Cipher泛指是密码学的加密算法,例如 aes, rsa, ecdh 等。 tls是由各类基础算法作为原语组合而成,一个CipherSuite是4个算法的组合:

  • 1个key exchange(密钥交换)算法
  • 1个authentication(身份认证)算法
  • 1个encryption(加密)算法
  • 1个message authentication code (消息认证码,简称MAC)算法

比如一个例子TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256。 表示的含义是TLS_ECDHE(密钥交换算法)_RSA(身份认证算法)_WITH_AES_128_GCM(AES128GCM对称加密算法) _SHA256(完整性包含的MAC算法)。

阅读全文 »

本篇文章就是来个大家普及一下证书的格式。

根据不同的服务器以及服务器的版本,我们需要用到不同的证书格式,就市面上主流的服务器来说,大概有以下格式:

.DER .CER文件是二进制格式,只保存证书,不保存私钥。
.PEM,一般是文本格式,可保存证书,可保存私钥。
.CRT,可以是二进制格式,可以是文本格式,与 .DER 格式相同,不保存私钥。
.PFX .P12,二进制格式,同时包含证书和私钥,一般有密码保护。
.JKS,二进制格式,同时包含证书和私钥,一般有密码保护。

DER该格式是二进制文件内容,Java 和 Windows 服务器偏向于使用这种编码格式。

阅读全文 »

首先通过PyQt5来创建一个GUI程序,比如我写的一个简单的计算器程序目录如下: img.png

运行效果如下: img.png

需要将这个GUI打包成windows上面的exe文件。发现了2个都能对python项目打包的工具:pyintaller和nuitka。

这2个工具同时都能满足项目的需要,两者都具备的优点:

  1. 隐藏源码。这里的pyinstaller是通过设置key来对源码进行加密的; 而nuitka则是将python源码转成C++(这里得到的是二进制的pyd文件,防止了反编译),然后再编译成可执行文件。
  2. 方便移植。用户使用方便,不用再安装什么python啊,第三方包之类的。
阅读全文 »