加密算法与证书

  sre, 开发

1.一些加密算法的漏洞
常见的加密算法通常分为分组加密算法和流加密算法两种。分组加密算法的代表:DES、3-DES、IDEA、AES等。流加密算法的代表:RC4、ORYX等。
在流密码的使用中,最常见的错误便是使用同一个密钥进行多次加解密。这使得破解流密码变得非常简单。这种攻击成为“Resused Key Attack”,在这种攻击下,攻击者不需要知道密钥,即可还原出明文。具体的攻击过程见附件XOR.java。
本章推荐尽量使用CBC模式的AES256加密算法。并且不要使用相同的key做相同的事情。
2.密钥管理
密钥管理中最常见的错误,就是将密钥硬编码在代码里。
一个比较安全的密钥管理系统,可以将所有的密钥(包括一些敏感配置文件)都集中在保存在一个服务器(集群)上,并通过Web Service的方法提供获取密钥的API。每个Web应用在需要使用密钥时,通过带认证信息的API请求密钥管理系统,动态获取密钥。密钥集中管理,降低系统对密钥的耦合性,也有利于定期更换密钥。
3.证书的认证与吊销
3.1通过业务代码认证证书
在业务代码中可以获取客户端证书的信息,如,证书的使用者信息。具体获取代码如下:
X509Certificate[] certs = (X509Certificate[]) req.getAttribute("javax.servlet.request.X509Certificate");
if (certs != null) {
for (int i = 0; i < certs.length; i++) { System.out.println("Client Certificate [" + i + "] = " + certs[i].getSubjectDN().getName()); } } else { if ("https".equals(req.getScheme())) { System.out.println("This was an HTTPS request, " + "but no client certificate is available"); } else { System.out.println("This was not an HTTPS request, " + "so no client certificate is available"); } }

在服务器端可以绑定使用者的一些信息,如绑定使用者名称和对应的一些白名单IP,当客户端请求服务器后,服务器端可以对比请求IP是否为证书绑定的白名单IP,来进行二次校验。这样,即使证书被盗,攻击者在不同的IP上请求服务器也会被服务器拦截。
3.2吊销证书
对于自签的根证书签发的服务器证书和客户端证书,我们统称为用户证书。如果用户证书泄露,则需要在根证书来吊销用户证书,以下为吊销用户证书的步骤。
1.吊销用户证书
a)首先需要执行如下指令
echo 00 > ./TestCA/crlnumber
b)执行吊销证书的指令
openssl ca -revoke ./TestClient/TestClient.crt -config ./conf/openssl.cnf

其中TestClient.crt为需要吊销的用户证书。
当吊销证书后,根证书路径下的index.txt文件中对应的证书列表将会由V变为R。
2.生成或更新吊销列表
openssl ca -gencrl -out ./TestCA/private/ca.crl -config ./conf/openssl.cnf
其中生成的ca.crl就是吊销证书列表。
这里需要注意的是,openssl.cnf配置文件中的default_crl_days参数,该参数代表下一个吊销列表将在多少天后发布。这里默认配置是7天,也就是说7天后,我们未更新crl文件,服务器将拒绝所有证书的匹配。
对应的解决方法为把default_crl_days参数的时间设置长一些,或者定期执行生成(更新)吊销列表的指令。
3.服务器的配置
Tomcat配置
Tomcat的配置需要在server.xml配置文件中增加标红的属性,如下:

Apache配置
Apache的配置修改Apache的conf目录下的httpd.conf文件。首先将#LoadModule ssl_module modules/mod_ssl.so前的#删除,使得Apache启动时加载mod_ssl.so模块,来启用https。之后增加如下配置。
SSLCARevocationPath "D:/ssl/Test/TestCA/private"
SSLCARevocationFile "D:/ssl/Test/TestCA/private/ca.crl"
Nginx配置
注意:nginx编译的时候要带上--with-http_ssl_module选项
nginx配置吊销证书列表如下标红属性。
server{
listen 443;
server_name localhost;
ssi on;
ssi_silent_errors on;
ssi_types text/shtml;
ssl on;
ssl_certificate /etc/pki/CA/server/server.crt;
ssl_certificate_key /etc/pki/CA/server/server.key;
ssl_client_certificate /etc/pki/CA/ca.crt;
ssl_verify_client on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers On;
ssl_crl /etc/pki/CA/server/ca.crl; #检查吊销的证书
location / {
proxy_pass http://localhost:8080; ##反向代理到tomcat 8080 端口
proxy_redirect default;
}
}

java

LEAVE A COMMENT

Captcha Code