SSL证书

225 阅读4分钟

SSL证书认证机构

比较常见和主流的两个SSL证书认证机构GlobalSignDigiCert

  • 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,例如掘金,博客园等 image.png

image.png

image.png

  • OV证书,大型网站使用较多,证书路径可能有OV字眼,使用者会显示公司名称,例如淘宝,百度,github等

image.png

image.png

image.png

  • EV证书,金融网站使用较多,证书路径可能出现EV字眼,使用者会显示SERIALNUMBER,例如中国银行网站

image.png

image.png

使用者

证书里的使用者,只用OpenSSL不好生成,借助于KeyStore Explorer能够用图形化界面管理,直接生成证书(如cer),私钥(如key),密钥对(如p12),可以直接添加extension里的使用者Subject Alternative Name,具体可参考教程blog.csdn.net/halozhy/art…

双向认证

实际应用中服务端认证的场景较多,但客户端也能做认证的,这种场景称之为双向认证.参考文章:www.jianshu.com/p/fb5fe0165…

从图可以看出,双向认证比单向认证多出了服务端校验客户端证书的步骤,而且将加密方案用客户端公钥加密,其余与双向认证都是一样的.

单向认证.webp 双向.webp

我自己做双向认证测试的时候,在nginx添加了以下配置(关键就是ssl_verify_clientssl_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证书验证要优雅的多.