我们在搭建web站点时,为了安全,现在都要使用SSL证书。
一个好用的测试网站可以检测你的SSL配置是否正确。
https://www.geocerts.com/ssl-checker
该网站可以自定义检测的端口(大部分检测网站都只能使用默认端口443)
检测结果如下
可以看到最后一栏,Certificate Chain Complete 检测的是证书链是否完整这里又警告。
正确配置的结果是这样的:
一般情况下,若是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.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中,新建域之后,其目录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