网站搭建 -- 部署Https 证书 缺少 Root CA Certificate

测试网站

我们在搭建web站点时,为了安全,现在都要使用SSL证书。

一个好用的测试网站可以检测你的SSL配置是否正确。

https://www.geocerts.com/ssl-checker

该网站可以自定义检测的端口(大部分检测网站都只能使用默认端口443)

网站搭建 -- 部署Https 证书 缺少 Root CA Certificate_第1张图片

 检测结果如下

网站搭建 -- 部署Https 证书 缺少 Root CA Certificate_第2张图片

可以看到最后一栏,Certificate Chain Complete  检测的是证书链是否完整这里又警告。

正确配置的结果是这样的:

网站搭建 -- 部署Https 证书 缺少 Root CA Certificate_第3张图片

一般情况下,若是web站点配置的证书链不完整,大部分浏览器访问都没有问题。

但是有些浏览器会有警告提示,需要手动点击确认,该浏览器在后续访问站点的时候才不会告警。但是对于一些网站之间的调用,如web小游戏,出现这个问题就会导致游戏无法正常加载,因为需要手动确认,而这个确认界面有时候又没有显示出来。

比如我的站点是nginx放置前端资源,glassfish部署后端程序,所以在这两个地方都需要正确安装包含完整根证书的证书链。

安装证书

现在某宝上购买泛域名的证书十分方便,卖家发给的文件包含几种web站点的配,他们已经分好类,十分方便。

[root@localhost ssl]# tree .
.
├── Apache
│   ├── CAChains.crt
│   ├── START-example-com.crt
│   └── START-example-com.key
├── CDN
│   ├── [1]START-example-com.crt
│   ├── [2]CAChains.crt
│   └── START-example-com.key
├── IIS
│   ├── CAChains.crt
│   └── START-example-com.pfx
└── Nginx
    ├── START-example-com.key
    └── START-example-com.pem

其中

  • CACahins.crt是证书链(即除开域名证书的所有上级证书,包括根证书和中间授权商的证书。)
  • START-example-com.crt是被授权域名*.example.com的域名证书。
  • START-example-com.key是私钥。

 

这些文件大部分以文本形式存在:

Apache/CAChains.crt

-----BEGIN CERTIFICATE-----
MIIGEzCCA/ugAwIBAgIQfVtRJrR2uhHbdBYLvFMNpzANBgkqhkiG9w0BAQwFADCB
...
00u/I5sUKUErmgQfky3xxzlIPK1aEn8=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFdzCCBF+gAwIBAgIQE+oocFv07O0MNmMJgGFDNjANBgkqhkiG9w0BAQwFADBv
...
0fKtirOMxyHNwu8=
-----END CERTIFICATE-----

Apache/START-aiwingaming-com.crt

-----BEGIN CERTIFICATE-----
MIIGBDCCBOygAwIBAgIQSI+LGG8Px7WUn1ZuXNahwjANBgkqhkiG9w0BAQsFADCB
...
nKdXTAI78B8=
-----END CERTIFICATE-----

Apache/START-example-com.key

-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCyHYcExMhnxL2q
...
6RwyQyYTO+KceoYYYA8aKvdX
-----END PRIVATE KEY-----

CDN/[1]START-example-com.crt

-----BEGIN CERTIFICATE-----
MIIGBDCCBOygAwIBAgIQSI+LGG8Px7WUn1ZuXNahwjANBgkqhkiG9w0BAQsFADCB
...
nKdXTAI78B8=
-----END CERTIFICATE-----

CDN/[2]CAChains.crt

-----BEGIN CERTIFICATE-----
MIIGEzCCA/ugAwIBAgIQfVtRJrR2uhHbdBYLvFMNpzANBgkqhkiG9w0BAQwFADCB
...
00u/I5sUKUErmgQfky3xxzlIPK1aEn8=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFdzCCBF+gAwIBAgIQE+oocFv07O0MNmMJgGFDNjANBgkqhkiG9w0BAQwFADBv
...
0fKtirOMxyHNwu8=
-----END CERTIFICATE-----

CDN/START-example-com.key

-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCyHYcExMhnxL2q
...
6RwyQyYTO+KceoYYYA8aKvdX
-----END PRIVATE KEY-----

IIS/CAChains.crt

-----BEGIN CERTIFICATE-----
MIIGEzCCA/ugAwIBAgIQfVtRJrR2uhHbdBYLvFMNpzANBgkqhkiG9w0BAQwFADCB
...
00u/I5sUKUErmgQfky3xxzlIPK1aEn8=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFdzCCBF+gAwIBAgIQE+oocFv07O0MNmMJgGFDNjANBgkqhkiG9w0BAQwFADBv
...
0fKtirOMxyHNwu8=
-----END CERTIFICATE-----

IIS/START-example-com.pfx

pfx不是文本文件就不显示了,一般会设置密码的,且卖家会告诉你。

Nginx/START-example-com.key

-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCyHYcExMhnxL2q
...
6RwyQyYTO+KceoYYYA8aKvdX
-----END PRIVATE KEY-----

Nginx/START-example-com.pem

-----BEGIN CERTIFICATE-----
MIIGBDCCBOygAwIBAgIQSI+LGG8Px7WUn1ZuXNahwjANBgkqhkiG9w0BAQsFADCB
...
nKdXTAI78B8=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIGEzCCA/ugAwIBAgIQfVtRJrR2uhHbdBYLvFMNpzANBgkqhkiG9w0BAQwFADCB
...
00u/I5sUKUErmgQfky3xxzlIPK1aEn8=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFdzCCBF+gAwIBAgIQE+oocFv07O0MNmMJgGFDNjANBgkqhkiG9w0BAQwFADBv
...
0fKtirOMxyHNwu8=
-----END CERTIFICATE-----

由上可以看到:

  • key都是一样的;
  • CAChains也都是一样的;
  • Apache/START-example-com.crt 和CDN/[1]START-example-com.crt是一样的,
  • 而START-example-com.pem只不过是把CAChains.crt和START-example-com.crt的内容合并起来。

其实后缀crt,pem都不重要,主要是看内容。

有些人喜欢把CAChains和域名证书合起来命名为bundle之类的。

 

对于nginx

一般是这样配置的,关键部分的nginx.conf内容如下

    server {
        listen 443 ssl;
        server_name test.example.com;
        ssl_certificate example.com.crt;
        ssl_certificate_key example.com.key;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers         HIGH:!aNULL:!MD5;
        location / {
            root   /opt/Resources;
            index  index.html index.htm;
        }
   }

然后吧crt和key文件放在nginx.conf同目录下即可,比较方便。

对于glassfish

因为卖家没有整理对应的文件,只有自己来弄下。

在glassfish中,新建域之后,其目录config下的domain.xml是关于该域的主要配置文件。可以看到

keyStore 和 trustStore 分别对应 config目录下的keystore.jks 和 cacerts.jks 文件。

 

-Djavax.net.ssl.keyStore=${com.sun.aas.instanceRoot}/config/keystore.jks
-Djavax.net.ssl.trustStore=${com.sun.aas.instanceRoot}/config/cacerts.jks

 

如果给你服务器签名的CA的根证书没有默认包含在你的 trust store 里面,你必须手动将根证书( root certificate)安装到 trust store里面。

1.导入一个根证书

执行如下命令

keytool  -import  -trustcacerts \
         -alias certAlias  \
         -file certFile  \
         -keystore trustStoreFile
  • certFile 就是crt证书,包含完整证书链的文件(如nginx的pem,或者自己合并的bundle文件)。
  • certAlias 就是一个代表该证书的别名(自己定义),glassfish有个别名是叫 s1as 就是常用来定义自己添加的证书。
  • trustStoreFile  在glassfish里面就是 yourdomainname/config/cacerts.jks 文件,

2.执行该命令时,提示符会询问你是否相信这个证书,你回答yes即可。

Trust this certificate? [no]:  yes
Certificate was added to keystore

3.确认domain.xml配置文件里有如下配置

-Djavax.net.ssl.trustStore=trustStoreFile

 

 

注:

我犯的错误就是在配置nginx和glassfish时,只用了域名证书,没有用完整的证书链(bundle),才出现了前面证书链不完整的错误。其实,刚开始接触证书,对于有些概念不是很清楚。有空可以看看一些相关书籍,不用都懂,看了大部分内容就可以了。

《HTTPS权威指南 在服务器和WEB应用上部署SSL TLS和PKL》

《OpenSSL Cookbook-OpenSSL攻略-中文版》

《Openssl编程-赵春平-中文版》

《CDN技术详解》

 

参考:

Oracle GlassFish Message Queue 4.4.2 Administration Guide

https://docs.oracle.com/cd/E19798-01/821-1794/aeoqc/index.html

你可能感兴趣的:(站点)