详解Nginx+TomcatHTTPSSSL配置⽅法
这篇⽂章涉及到很多专业术语,例如密钥对,私钥,公钥,证书等等,关于加密的理论和概念请参考我之前写的《》,我在这篇⽂章中就不重复这些概念了。
1. 申请 SSL 证书
你可以从很多⽹站购买到SSL证书,我经常使⽤的是。证书都是收费的(据说有免费的,没试过),价格有贵的有便宜的。它们的区别是发⾏证书的机构不同,贵的证书机构更权威,证书被否决的⼏率更⼩。正规运营的⽹站建议购买好⼀点的证书,免了⿇烦,也贵不了多少。
1.1 ⽣成 CSR ⽂件
申请证书的时候,证书的发⾏机构会要求你提供⼀个CSR(Certificate Signing Request)⽂件,这个⽂件包含了发⾏机构需要的所有信息。在⽣成CSR之前,我们必须先创建密钥对:
$JAVA_HOME/bin/keytool -genkey -alias <your_alias_name> -keyalg RSA -keystore <your_keystore_filename> -keysize 2048
这⾥我们使⽤的是RSA⾮对称算法,2048位的密钥(好的证书机构强制2048位)。<your_alias_name>可以是⽹站名,⽐
如“linuxde”,同理<your_keystore_filename>可以是linuxde.keystore。
这个命令会让你输⼊私钥所有者的信息,也就是你的⽹站的信息,这⾥只有⼀个字段是关键的“Common Name(CN)”,这个字段应该是你的⽹站域名,例如“www.linuxde”,别的字段例如国家地区什么的你看着填就⾏了。使⽤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>
nginx和apache区别这⾥ <your_alias_name> 和上⾯⼀步是⼀致的,我这⾥输⼊ linuxde ,<your_keystore_filename>输⼊ linuxde.keystore。这⼀步会问你要keystore密码,就是你上⼀步设置的密码。⽣成的“certreq.csr”是⼀个⽂本⽂件,你打开应该看到类似如下内容:
-----BEGIN NEW CERTIFICATE REQUEST-----
MIICvzCCAacCAQAwejELMAkGA1UEBhMCQ04xEjAQBgNVBAgTCUd1YW5nZG9uZzERMA8GA1UEBxMI
U2hlbnpoZW4xFDASBgNVBAoTC09TQ2hpbmEuTkVUMRQwEgYDVQQLEwtPU0NoaW5hLk5FVDEYMBYG
A1UEAxMPd3d3Lm9zY2hpbmEubmV0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnyZ3
8SXC6FmggtMtGBMCW/L88qd2DXjeryQExyUfy30VU4ROYcPnLNZXtwtE+poOf7AdqrQvrYBNJsls
xAmlKEKN7t1ATq3vYSaygx74Ixh4lsYQhJA03sZlcIe8N1EoSYwvch37ksQfhXC/zcZ9ltT9Pk67
dZTVoNPwI92bxH1VpCwnpNpygT1v8YSCQM6mIrBkWeNuWolhYQmKSRgOM9gV8hd06zBd6mNBGdxB
ktZ6KlZQp8i+A4hevcRuo9ebNLIhfERDghgos+zbaq1d2whgWegdv/mLnudLHjyyqcEBwk87rp7n
zFh2C220JmDMXAMGsz0QeA60wpRC6492UwIDAQABoAAwDQYJKoZIhvcNAQEFBQADggEBAGfLBzJt
+CFJ0v4LzttWHNMEpj5rvtoEBr2QYtB0op2y27mp0qwqCfCj0wv3Rw8xZzh6oPKx0NB2tnWqcqyN
XmVW4nl3SLd9bdY3I7/wdQkriCd6sBgn6Voh8mJOGKKtNZADQ3AfqUD1ge39bL+v7H0EdwtOfmCr
tAn35+qIIXH3SWS2R+G5sqa76GgjSRwkN8awzrbZJbA/hRPi5wwL+RV3/NFWfFmr4hpsuWHos7ly
5iFJpQqWVodpq9mxaaugzKvv0HG+A8ip0DG+vB8SnUgBMnAMM8UP1P2ozgNG0Twncq+uIAyz0Uw9
IzQHiWhtGpFAN9RO0xPl4EnYW6A+TM4=
-----END NEW CERTIFICATE REQUEST-----
你把CSR的内容提供给证书发⾏机构就⾏了。
1.2 提交认证请求
在你提交证书签名请求以后,证书发⾏机构会让你提供⼀个管理员邮箱来验证你的请求。例如我是给 linuxde 请求签名,它就要我提供 admin@linuxde 或者 webmaster@linuxde 来验证这个请求的确是拥有 linuxde 域名的⼈发起的。收到证书发⾏机构的验证邮件后,你去确认,然后付款就会收到签名后的证书(实时的,不需要等待):
-----BEGIN CERTIFICATE-----
MIIFBDCCA+ygAwIBAgIDA7WjMA0GCSqGSIb3DQEBBQUAMGExCzAJBgNVBAYTAlVT
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMR0wGwYDVQQLExREb21haW4gVmFsaWRh
dGVkIFNTTDEbMBkGA1UEAxMSR2VvVHJ1c3QgRFYgU1NMIENBMB4XDTEyMDIyNjA0
NTQyMVoXDTE0MDIyNzExMDQwMFowge0xKTAnBgNVBAUTIGxEMEdjSW1OSlhyQTZY
YXUtU055R1prTUtXdUdQVDFkMQswCQYDVQQGEwJDTjEYMBYGA1UEChMPd3d3Lm9z
Y2hpbmEubmV0MRMwEQYDVQQLEwpHVDg3NjQ4MDE5MTEwLwYDVQQLEyhTZWUgd3d3
Lmdlb3RydXN0LmNvbS9yZXNvdXJjZXMvY3BzIChjKTEyMTcwNQYDVQQLEy5Eb21h
aW4gQ29udHJvbCBWYWxpZGF0ZWQgLSBRdWlja1NTTChSKSBQcmVtaXVtMRgwFgYD
VQQDEw93d3cub3NjaGluYS5uZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQCfJnfxJcLoWaCC0y0YEwJb8vzyp3YNeN6vJATHJR/LfRVThE5hw+cs1le3
C0T6mg5/sB2qtC+tgE0myWzECaUoQo3u3UBOre9hJrKDHvgjGHiWxhCEkDTexmVw
h7w3UShJjC9yHfuSxB+FcL/Nxn2W1P0+Trt1lNWg0/Aj3ZvEfVWkLCek2nKBPW/x
hIJAzqYisGRZ425aiWFhCYpJGA4z2BXyF3TrMF3qY0EZ3EGS1noqVlCnyL4DiF69
xG6j15s0siF8REOCGCiz7NtqrV3bCGBZ6B2/+Yue50sePLKpwQHCTzuunufMWHYL
bbQmYMxcAwazPRB4DrTClELrj3ZTAgMBAAGjggE2MIIBMjAfBgNVHSMEGDAWgBSM
9NmTCke8AKBKzkt1bqC2sLJ+/DAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYI
KwYBBQUHAwEGCCsGAQUFBwMCMCcGA1UdEQQgMB6CD3d3dy5vc2NoaW5hLm5ldIIL
b3NjaGluYS5uZXQwQQYDVR0fBDowODA2oDSgMoYwaHR0cDovL2d0c3NsZHYtY3Js
Lmdlb3RydXN0LmNvbS9jcmxzL2d0c3NsZHYuY3JsMB0GA1UdDgQWBBSMnwGchSF9
4rpwjGM0R5TdD/OU3zAMBgNVHRMBAf8EAjAAMEcGCCsGAQUFBwEBBDswOTA3Bggr
BgEFBQcwAoYraHR0cDovL2d0c3NsZHYtYWlhLmdlb3RydXN0LmNvbS9ndHNzbGR2
LmNydDANBgkqhkiG9w0BAQUFAAOCAQEAYtzSVIU/O43qyL4mBFv8DSwoLfi5kHIz
35sBVHM1Z3LW8tnIyscPewYZdy6pszBsm4AtJ0C+fdCM6Ai4GnMdIacao18OIcXS
n2ZiYVrZAs/GCzHRpCpu3VfFTogBiuTS+/Sm87KD8o1kHCxGxNDftfPorq4K5B+0
sIWhxU2gErog1vkGqzuO5CiupMIIp6swqGR0rUnh7XH+WkfjamnU9I8Yqz//QENT
cIaUI/2E2btqCvK4vgtsvhzYHLhmcGljiu0PEeCtIBa4CZSiiMk6E9P7tb/+l3o4
CS9dHYutNG1LqN3FNx34EYBYykGOz2N79L3BIUwIXa7v7QoO+T+c6w==
-----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 linuxde -trustcacerts -file linuxde.p7s -keystore linuxde.keystore
上⾯的命令中 alias “linuxde” 和之前申请证书的时候输⼊的 alias 要⼀致。
2.2 修改Tomcat配置
<Connector SSLEnabled="true" acceptCount="100" clientAuth="false"
disableUploadTimeout="true" enableLookups="false" maxThreads="25"
port="8443" keystoreFile="/linuxde/webapp/linuxde.keystore" keystorePass="xxxxxxx"
protocol="http11.Http11NioProtocol" scheme="https"
secure="true" sslProtocol="TLS" />
3. 部署证书到
Nginx和Tomcat不⼀样,它要求的是证书⽂件 .crt 和私钥 .key 。遗憾的是,我们的私钥在keystore⾥⾯,⽽JDK⾃带的keytool并不提供私钥的导出功能,所以我们得借助第三⽅⼯具来导出私钥。
3.1 导出私钥(key)
有⼀个开源的私钥导出⼯具叫做 -exportpriv 。它是⼀个简单的java程序,你下载以后参考它的说明,编译,然后运⾏即可,⾮常简单,我就不多罗嗦了。
3.2 创建certificate chain
和Apache不⼀样,Nginx没有Certificat Chain这个参数,所以你要把你的证书和中间证书合并。合并证书很简单,创建⼀个先的⽂件,内容如下:
-----BEGIN CERTIFICATE-----
这⾥是你证书的内容
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
这⾥是中间证书的内容
-----END CERTIFICATE-----
3.3 修改Nginx配置⽂件
server {
listen 443 ssl;
server_name localhost;
ssl on;
ssl_certificate /linuxde/;
ssl_certificate_key /linuxde/webapp/linuxde.key;
location / {
f;
proxy_pass 61.145.122.155:443;
}
}
4. 验证证书是否安装正确
⾸先当然是⾃⼰⽤HTTPS的⽅式访问⾃⼰的⽹站,看看浏览器是否报错或者报警,记得要把各种浏览器都试⼀遍。然后⽤来测试你的⽹站HTTPS的配置是否正确,如果都测试通过,那么就打⼯搞成啦!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论