目录
1、HTTPS介绍
HTTP是明文传输,HTTPS是通过TLS将传输数据加密后传输,更具安全性,简单来说HTTPS=HTTP+SSL/TLS。
1、客户端向服务端发送加密版本、加密算法种类、随机数信息等。
2、服务端返回客户端发送的信息并带上服务端证书(公钥证书)。
3、客户端效验服务端证书的合法性。
4、验证不通过终止通信,验证通过继续通信,客户端将自己所支持的所有加密算法全部发送给服务端供服务端进行选择。
5、服务端在客户端发送的加密算法中选择加密程度最高的机密方式。
6、服务端将选择的加密算法通过明文返回给客户端。
7、客户端收到服务端返回的加密方式后,使用该加密方式生成随机码(用作后续通信过程中加密的秘钥),使用服务端返回的公钥加密后发送至服务端。
8、服务端收到信息后,使用自己的私钥进行解密,获取加密秘钥。
在之后的通信中,客户端和服务端都将采用该秘钥进行加密。
2、客户端生成证书
以fix双向认证模式,客户端需根据服务端的提供的证书及公钥转成所需的证书
- openssl pkcs12 -export -in /tempfile/client.crt -inkey /tempfile/client.key -out /tempfile/client.p12
- keytool -importkeystore -destkeystore /tempfile/client.jks -srckeystore /tempfile/client.p12 -srcstoretype PKCS12 -srcstorepass Za123456
- keytool -importcert -file /tempfile/root.crt -keystore /tempfile/root.jks
其中,client.crt、client.key为服务端线下提供的证书及公钥,客户端转成.jks文件供程序使用。
其中第一、第二个命令尽量保证一致,以免混记、漏记。
fix的相关配置如下:
fix.exchange.XXX.sessions[0].socketKeyStore=\\temp\\crypto\\ssl\\qa\\client.jks fix.exchange.XXX.sessions[0].socketKeyStorePassword=Aa123456 fix.exchange.XXX.sessions[0].socketTrustStore=\\temp\\crypto\\ssl\\qa\\root.jks fix.exchange.XXX.sessions[0].socketTrustStorePassword=Aa123456
3、服务端选择证书的配置
3.1、查看证书信息
SSL官网查看域名对应的证书,可看到域名支持的算法种类,域名地址:
SSL官网 SSL Server Test (Powered by Qualys SSL Labs)
以baidu.com为例:
根据 Cipher Suites 部分,我们可以知道该网站支持的加密套件;
根据 Protocol Details 的信息,可以使用底层协议版本以及是否支持前向安全保障来确定服务端实际使用的加密套件。在 "Cipher Suite" 右侧,针对每种加密套件最后都有一行 Facility,其中 FS
代表支持前向安全保障;
3.2、如何选择加密套件
以nginx配置为例:
- ssl_ciphers ALL:!DH:!EXPORT:!RC4:+HIGH:+MEDIUM:-LOW:!aNULL:!eNULL;
这个配置的作用是限制SSL加密套件的使用范围,禁止使用部分存在漏洞或弱加密算法的加密套件,只允许使用更安全和强的加密算法,提高加密的安全性。具体参数意义如下:
- ALL:所有加密套件,表示可以使用任何加密套件
- !DH:禁止使用DHE密钥交换算法的加密套件
- !EXPORT:禁止使用弱加密算法的加密套件,避免被攻击者通过暴力破解获取加密信息
- !RC4:禁止使用RC4算法的加密套件,因为RC4算法存在安全漏洞
- +HIGH:只允许使用强加密算法的加密套件
- +MEDIUM:可以使用中等强度加密算法的加密套件
- -LOW:禁止使用较弱的加密算法的加密套件
- !aNULL:禁止使用无验证客户端的加密套件
- !eNULL:禁止使用无加密的加密套件
- ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
这是另一个ssl_ciphers指令的配置示例,它同样是用于限制使用的SSL加密套件。该配置中主要使用了一些加密套件的名称,它指定了允许使用的加密套件集合,不允许使用其他加密套件。在使用时,nginx 将优先使用该配置数组中列出的第一项加密套件,如果客户端或者服务端不支持该加密套件,将按照优先级使用该数组中其他的加密套件。其中指定的加密套件描述如下:
- ECDHE-RSA-AES256-GCM-SHA512:使用ECDHE和RSA算法,结合AES-GCM算法和SHA-512哈希算法实现的加密套件,具有高强度的加密和完整性验证能力。
- DHE-RSA-AES256-GCM-SHA512:使用DHE和RSA算法,结合AES-GCM算法和SHA-512哈希算法实现的加密套件,同样具有高强度的加密和完整性验证能力。
- ECDHE-RSA-AES256-GCM-SHA384:使用ECDHE和RSA算法,结合AES-GCM算法和SHA-384哈希算法实现的加密套件,同样具有高强度的加密和完整性验证能力。
- DHE-RSA-AES256-GCM-SHA384:使用DHE和RSA算法,结合AES-GCM算法和SHA-384哈希算法实现的加密套件,同样具有高强度的加密和完整性验证能力。
- ECDHE-RSA-AES256-SHA384:使用ECDHE和RSA算法,结合AES-CBC算法和SHA-384哈希算法实现的加密套件,同样具有高强度的加密和完整性验证能力。