SSL证书认证机构
比较常见和主流的两个SSL证书认证机构GlobalSign
和DigiCert
- GlobalSign
- 成立于1996年,根证书1998年
- 主要用户:百度、谷歌、阿里巴巴、腾讯、爱奇艺、京东、中国政府网等
- DigiCert
- 成立于2003年,根证书发布2006年
- 主要用户:Microsoft、Adobe、citrix 相差8年,这意味着差距8年的操作系统及浏览器信任
证书类型
目前,市场上支持全球信任浏览器的SSL证书主要有三种:EV SSL证书、OV SSL证书和DV SSL证书.
- DV(Domain Validation)证书
- 指只验证网站域名所有权的简易SSL证书.这种证书只能加密网站的机密信息,不能向用户证明网站的真实身份
- OV(Organization Validation)证书
- 指需要验证网站所有单位真实身份的标准型SSL证书,不仅可以加密网站机密信息,还可以向用户证明网站的真实身份
- EV(Extended Validation)证书
- 指按照世界统一的严格身份验证标准发行的SSL证书,是目前业界最安全的SSL证书.以前用户访问部署EV证书的网站,不仅浏览器地址栏会显示安全锁标志,浏览器地址栏也会变绿.但是从某一年开始,浏览器中取消了EV SSL 主体名称的显示,现在你都看不到绿色安全锁了,可能EV证书也不好卖了
证书举例
- DV证书,小网站使用较多,证书路径会出现DV字眼,使用者只有一句CN=xxx,例如掘金,博客园等
- OV证书,大型网站使用较多,证书路径可能有OV字眼,使用者会显示公司名称,例如淘宝,百度,github等
- EV证书,金融网站使用较多,证书路径可能出现EV字眼,使用者会显示SERIALNUMBER,例如中国银行网站
使用者
证书里的使用者,只用OpenSSL不好生成,借助于KeyStore Explorer能够用图形化界面管理,直接生成证书(如cer),私钥(如key),密钥对(如p12),可以直接添加extension里的使用者Subject Alternative Name
,具体可参考教程blog.csdn.net/halozhy/art…
双向认证
实际应用中服务端认证的场景较多,但客户端也能做认证的,这种场景称之为双向认证.参考文章:www.jianshu.com/p/fb5fe0165…
从图可以看出,双向认证比单向认证多出了服务端校验客户端证书的步骤,而且将加密方案用客户端公钥加密,其余与双向认证都是一样的.
我自己做双向认证测试的时候,在nginx添加了以下配置(关键就是ssl_verify_client
和ssl_client_certificate
),但是一直返回400 bad request,验证无果只好放弃,如果有朋友知道其中原因请一定要告诉我
server {
# 服务器端口使用443,开启ssl, 这里ssl就是上面安装的ssl模块
listen 443 ssl;
# 域名,多个以空格分开
server_name ypq.org;
# ssl证书地址
ssl_certificate ssl/ypq.org.cer; # pem文件的路径
ssl_certificate_key ssl/ypq.org.key; # key文件的路径
# ssl验证相关配置
ssl_session_timeout 5m; #缓存有效期
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #加密算法
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #安全链接可选的加密协议
ssl_prefer_server_ciphers on; #使用服务器端的首选算法
ssl_client_certificate ssl/ca.cer; # 客户端的证书由该CA签发,用来校验客户端证书合法性
ssl_verify_client on; # 开启客户端认证
location / {
root html;
index index.html index.htm;
}
}
java客户端信任证书
java客户端和浏览器的信任证书在不同的地方管理,JDK信任的根证书是cacert,如
- jdk11,
liberica-11.0.12\lib\security\cacert
- jdk8,
temurin-1.8.0_302\jre\lib\security\cacert
当java http客户端访问自签发证书的网站时,会出现PKIX path building failed
unable to find valid certification path to requested target
等错误提示,表明找不到合适的证书.
通过JDK自带的keytool
工具能够导入自签发证书,有两种常见方法: - 导入到根证书库cacert,
keytool -import -file ca.cer -alias myca -keystore cacerts -storepass changeit
,-file是指被导入的证书, -alias是证书的别名,用于后续管理 -keystore是证书库,这里是原来的根证书库, -storepass是证书库的密码,默认是changeit
- 导入到自定义证书库,
keytool -import -file ca.cer -alias myca -keystore mycaTrustStore -storepass changeit
, 差别在于keystore指向一个新的证书库,在程序启动时可以通过-Djavax.net.ssl.trustStore=\path\to\mycaTrustStore
-Djavax.net.ssl.trustStorePassword=changeit
让java客户端找到证书库,也可以通过System.setProperty设置
System.setProperty("javax.net.ssl.trustStore", "\path\to\caTrustStore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
在java客户端找到证书之后,再也不会出现PKIX path building failed
等错误了,这种方法比强制忽略所有SSL证书验证要优雅的多.