前言:这篇文章涉及到很多专业术语,例如密钥对,私钥,公钥,证书等等,关于加密的理论和概念请参考我之前写的 《SSL 与数字证书》,我在这篇文章中就不重复这些概念了。
1. 申请 SSL 证书
你可以从很多网站购买到SSL证书,我经常使用的是 GeoTrust 。证书都是收费的(据说有免费的,没试过),价格有贵的有便宜的。它们的区别是发行证书的机构不同,贵的证书机构更权威,证书被浏览器否决的几率更小。正规运营的网站建议购买好一点的证书,免了麻烦,也贵不了多少。
1.1 生成 CSR 文件
申请证书的时候,证书的发行机构会要求你提供一个CSR(Certificate Signing Request)文件,这个文件包含了发行机构需要的所有信息。在生成CSR之前,我们必须先创建密钥对:
$JAVA_HOME/bin/keytool -genkey -alias <your_alias_name> -keyalg RSA -keystore <your_keystore_filename> -keysize
这里我们使用的是RSA非对称算法,2048位的密钥(好的证书机构强制2048位)。可以是网站名,比如“oschina”,同理可以是oschina.keystore。
这个命令会让你输入私钥所有者的信息,也就是你的网站的信息,这里只有一个字段是关键的“Common Name(CN)”,这个字段应该是你的网站域名,例如“www.oschina.net”,别的字段例如国家地区什么的你看着填就行了。使用keytool工具的话,它提示输入“first and last name”就是让你输入“Common Name”。在你填完信息以后,它会让你设置keystore和密钥的访问密码,你输入就行了,建议使用相同的密码。如果不输入的话,默认密码是“changeit”。
下面来生成CSR文件:
$JAVA_HOME/bin/keytool -certreq -keyalg RSA -alias <your_alias_name> -file certreq.csr -keystore <your_keystore_filename>
这里 和上面一步是一致的,我这里输入 oschina ,输入 oschina.keystore。这一步会问你要keystore密码,就是你上一步设置的密码。生成的“certreq.csr”是一个文本文件,你打开应该看到类似如下内容:
-----BEGIN NEW CERTIFICATE REQUEST-----
MIICvzCCAacCAQAwejELMAkG
U2hlbnpoZW4xFDASBgNVBAoT
A1UEAxMPd3d3Lm9zY2hpbmEu
8SXC6FmggtMtGBMCW/L88qd2DXjeryQExyUfy30VU4
xAmlKEKN7t1ATq3vYSaygx74
dZTVoNPwI92bxH1VpCwnpNpy
ktZ6KlZQp8i+A4hevcRuo9ebNLIhfERDghgo
zFh2C220JmDMXAMGsz0QeA60
+CFJ0v4LzttWHNMEpj5rvtoEB
XmVW4nl3SLd9bdY3I7/wdQkriCd6sBgn6Voh8mJOGKK
tAn35+qIIXH3SWS2R+G5sqa76GgjSRwkN8awzrbZJb
5iFJpQqWVodpq9mxaaugzKvv
IzQHiWhtGpFAN9RO0xPl4EnY
-----END NEW CERTIFICATE REQUEST-----
你把CSR的内容提供给证书发行机构就行了。
1.2 提交认证请求
在你提交证书签名请求以后,证书发行机构会让你提供一个管理员邮箱来验证你的请求。例如我是给 oschina.net 请求签名,它就要我提供 [email protected] 或者 [email protected] 来验证这个请求的确是拥有 oschina.net 域名的人发起的。收到证书发行机构的验证邮件后,你去确认,然后付款就会收到签名后的证书(实时的,不需要等待):
-----BEGIN CERTIFICATE-----
MIIFBDCCA+ygAwIBAgIDA7WjMA0GCSqGSI
MRYwFAYDVQQKEw1HZW9UcnVz
dGVkIFNTTDEbMBkGA1UEAxMS
NTQyMVoXDTE0MDIyNzExMDQw
YXUtU055R1prTUtXdUdQVDFk
Y2hpbmEubmV0MRMwEQYDVQQL
Lmdlb3RydXN0LmNvbS9yZXNv
aW4gQ29udHJvbCBWYWxpZGF0
VQQDEw93d3cub3NjaGluYS5u
AoIBAQCfJnfxJcLoWaCC0y0Y
C0T6mg5/sB2qtC+tgE0myWzECaUoQo3u3UBOre9
h7w3UShJjC9yHfuSxB+FcL/Nxn2W1P0+Trt1lNWg0/Aj3ZvEfVWkLCek2nKBPW/x
hIJAzqYisGRZ425aiWFhCYpJ
xG6j15s0siF8REOCGCiz7Ntq
bbQmYMxcAwazPRB4DrTClELr
9NmTCke8AKBKzkt1bqC2sLJ+/DAOBgNVHQ8BAf8EBAMCBaAwH
KwYBBQUHAwEGCCsGAQUFBwMC
b3NjaGluYS5uZXQwQQYDVR0f
Lmdlb3RydXN0LmNvbS9jcmxz
4rpwjGM0R5TdD/OU3zAMBgNVHRMBAf8EAjAAME
BgEFBQcwAoYraHR0cDovL2d0
LmNydDANBgkqhkiG9w0BAQUF
35sBVHM1Z3LW8tnIyscPewYZ
n2ZiYVrZAs/GCzHRpCpu3VfFTogBiuTS+/Sm87KD8o1kHCxGxNDftfPorq
sIWhxU2gErog1vkGqzuO5Ciu
cIaUI/2E2btqCvK4vgtsvhzYHLhmcG
CS9dHYutNG1LqN3FNx34EYBY
-----END CERTIFICATE-----
这就是你的网站,经过权威机构签名的证书。当用户通过HTTPS访问你的网站的时候,浏览器会验证这个证书。
1.3 下载证书
证书分很多种格式,例如X.509(.crt文件)、PKCS #7(.p7s文件)等等。不同的网站服务器可能要求不同格式的证书。很多时候,给我们的证书签名的是二级证书机构,它上面还有根证书机构。所以你在购买签名过的证书以后,它还会给你一个它自己的证书叫做“Intermediate CA(中间证书)”,格式和你自己的证书是一样的。在部署证书的时候你需要同时部署你自己的证书还有中间证书,这就叫做Certificate Chain。好的证书发行机构会提供多种证书供你选择下载,建议下载同时下载X.509还有 PKCS #7两种格式。不要忘记下载 X.509格式的中间证书。PKCS #7格式的不要是因为这个格式自带了各种中间证书。
2. 部署证书到Tomcat
Tomcat要求的是包含签名过证书的keystore文件和keystore密码。所以我们要先把证书导入keystore
2.1 导入证书到KeyStore
$JAVA_HOME/bin/keytool -import -alias oschina -trustcacerts -file oschina.p7s -keystore oschina.keystore
上面的命令中 alias “oschina” 和之前申请证书的时候输入的 alias 要一致。
2.2 修改Tomcat配置
<Connector SSLEnabled="true" acceptCount="100" clientAuth="false"disableUploadTimeout="true" enableLookups="false" maxThreads="25"
port="8443" keystoreFile="/oschina/webapp/oschina.keystore" keystorePass="xxxxxxx"
protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https"
secure="true" sslProtocol="TLS" />
3. 部署证书到Nginx
Nginx和Tomcat不一样,它要求的是证书文件 .crt 和私钥 .key 。遗憾的是,我们的私钥在keystore里面,而JDK自带的keytool并不提供私钥的导出功能,所以我们得借助第三方工具来导出私钥。
3.1 导出私钥(key)
有一个开源的私钥导出工具叫做 java-exportpriv 。它是一个简单的java程序,你下载以后参考它的说明,编译,然后运行即可,非常简单,我就不多罗嗦了。
3.2 创建certificate chain
和Apache不一样,Nginx没有Certificat Chain这个参数,所以你要把你的证书和中间证书合并。合并证书很简单,创建一个先的文件 oschina-chain.crt,内容如下:
-----BEGIN CERTIFICATE-----
这里是你证书的内容
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
这里是中间证书的内容
-----END CERTIFICATE-----
3.3 修改Nginx配置文件
server {listen ssl;
server_name localhost;
ssl on;
ssl_certificate /oschina/webapp/oschina-chain.crt;
ssl_certificate_key /oschina/webapp/oschina.key;
location / {
include proxy.conf;
proxy_pass https://61.145.122.155:443;
}
}
4. 验证证书是否安装正确
首先当然是自己用HTTPS的方式访问自己的网站,看看浏览器是否报错或者报警,记得要把各种浏览器都试一遍。然后用 在线工具来测试你的网站HTTPS的配置是否正确,如果都测试通过,那么就大功搞成啦!