SSL在tomcat上的配置,nginx上的简单配置 及其注意事项

本文偏重于证书申请、下载、tomcat中的配置。nginx配置为简化版,详细配置、高级定制配置见我另一篇博客。

ssl申请前,需要想清楚要购买通配符域名(*.xxx.com)还是静态域名,通配符贵一些但能支持全站多域名。

先生成对应的keystore和key文件,并使用keystore生成一个csr(Certificate Signing Request证书签名申请)文件(keystore密钥库、key私钥、csr证书申请文件建议都保留)。

通常使用java自带的keytool生成keystroe和csr,使用openssl生成key。

提交ca站,购买证书,设置有效期,校验域名所有权,得到证书,下载证书。

以上步骤略,网上很多。

注意!!申请证书前,需要创建csr(Certificate Signing Request 证书请求文件)和keystore(秘钥库),秘钥库创建时需要加-keyalg RSA参数,如 keytool -keysize 2048 -genkey -alias myweb -keyalg RSA -keystore myweb.keystore

创建CSR,如keytool -certreq -keyalg RSA -alias myweb -file myweb.csr -keystore myweb.keystore

提取key私钥文件,用java方式从keystroe中提取。

下载证书

证书分很多种格式,例如X.509(.crt文件)、PKCS #7(.p7s文件)等等。不同的网站服务器可能要求不同格式的证书。很多时候,给我们的证书签名的是二级证书机构,它上面还有根证书机构。所以你在购买签名过的证书以后,它还会给你一个它自己的证书叫做“Intermediate CA(中间证书)”,格式和你自己的证书是一样的。在部署证书的时候你需要同时部署你自己的证书还有中间证书,这就叫做Certificate Chain。好的证书发行机构会提供多种证书供你选择下载,建议下载同时下载X.509还有 PKCS #7两种格式。不要忘记下载 X.509格式的中间证书。PKCS #7格式的不要是因为这个格式自带了各种中间证书。

godaddy的tomcat证书安装说明:https://sg.godaddy.com/zh/help/tomcat-4x5x6x7x-ssl-5239

以godaddy站点购买的证书为例,下载时选择tomcat会得到一个压缩包,内含3个crt证书文件:

gd_bundle-g2-g1.crt 官网说明:Go Daddy Certificate Bundles - G2 With Cross to G1 (GoDaddy 证书捆绑包 - G2 与 G1 交叉认证, 包含根证书)

gdig2.crt 官网说明:Go Daddy Secure Server Certificate (Intermediate Certificate) - G2 (GoDaddy 安全服务器证书(中间证书) - G2)

xxxxxx.crt 官网说明:压缩包里面一个随机id.crt的文件,这是自己站点的证书

正常给人的感觉是分别导入

gd_bundle-g2-g1.crt

gdig2.crt

xxxxxx.crt

是可以的,godaddy的文档貌似也是这么解释的,实际上不是。

需要访问 https://certs.godaddy.com/repository 下载gdroot-g2.crt(GoDaddy 第 2 级证书颁发机构根证书 - G2),作为root CA进行签名。

如果是tomcat6/7,需要下载gdroot-g2_cross.crt(GoDaddy G1 至 G2 的交叉证书),用法同gdroot-g2.crt。

导入过程为:

keytool -import -alias root -keystore xxxx.keystore -storepass 密码 -trustcacerts -file gdroot-g2.crt

keytool -import -alias intermed -keystore xxxx.keystore -storepass 密码 -trustcacerts -file gdig2.crt

keytool -import -alias 你的别名 -keystore xxxx.keystore -storepass 密码 -trustcacerts -file 随机id.crt

”xxxx“是keystore的名字,切记!!!!这个keystore(秘钥库,申请前创建时别忘了加-keyalg RSA参数)是之前申请证书的时候生成的,此处将CA反馈的证书累加到当时的keystore里!!切记!!

”你的别名“是你申请证书前创建keystore使用的alias

”密码“是你申请证书前创建keystore和csr使用的密码

需要注意的是,如果直接把gd_bundle-g2-g1.crt作为root,会报告错误:无法从回复中建立链(Failed to establish chain from reply)

1、ssl在tomcat中的配置

把这个keystore配置到tomcat里

server.xml中,8443的配置默认注销,要放开,并修改类似下面例子。其中keystoreFile为上一步中生成。

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"

SSLEnabled="true" keystoreFile="/etc/tomcat7/sslfile/myweb.keystore"

keystorePass="eling10" keyAlias="xxx"

SSLHonorCipherOrder="true" SSLDisableCompression="true" sslEnabledProtocols="TLSv1.2,TLSv1.1,TLSv1" ciphers="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_DSS_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,TLS_DHE_DSS_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA"

maxThreads="200" acceptCount="100" clientAuth="false"

disableUploadTimeout="true" enableLookups="false"

scheme="https" secure="true" sslProtocol="TLS" />

其中,需要注意的参数包括sslEnabledProtocols,涵盖的哪些协议。ciphers,表示支持的加密方式,目前RC4加密已经被破解而被大多数浏览器抛弃(该参数可不指定)。

keyAlias="xxx"是指定keystore的别名,如不指定,tomcat默认使用"tomcat",别名不同可能tomcat启动时报出异常“Alias name tomcat does not identify a key entry”。该值为import keystroe的时候指定的,如果不记得,cmd到keystore路径下,用keytool -keystore xxx.keystore -list命令,输入密码,即可看到别名,返回多个证书的第一行(如上面曾经import三个证书,第二个是我们自己的证书)即可见到别名。

clientAuth="false"表示单项认证,只认证服务器本身,而不需要认证客户端的证书(例如网银就是典型的双向认证,各种U宝UKey里包含客户端证书。双向认证的我没做过)。

其他参数含义请自行搜索。有些是为了调优。

如果该tomcat同时允许http和https都请求(例如tomcat内部署多个项目,或项目本身就允许两种访问),8080(tomcat里默认的http端口)端口的那条Connector可保留。

如果该tomcat只允许https则更改8080那一条Connector,在后边加入redirectPort="8443",且项目中的web.xml(或tomcat自带的web.xml)需要更改对应项,详见下面。

测试

启动 Tomcat 并访问 https://localhost:8443 你将看到 Tomcat 默认的首页(我自己做的那个tomcat,是隐藏在nginx后,且购买的证书匹配的是域名,所以这一步测试访问失败)。

访问默认的 8080 端口,还是有效的。

2、ssl在项目中的配置

tomcat自带web.xml

打开$CATALINA_HOME/conf/web.xml,在该文件末尾增加:

<security-constraint>

<web-resource-collection >

<web-resource-name >SSL</web-resource-name>

<url-pattern>/*</url-pattern>

</web-resource-collection>

<user-data-constraint>

<transport-guarantee>CONFIDENTIAL</transport-guarantee>

</user-data-constraint>

</security-constraint>

注意上述配置,/*将强制所有链接都要求SSL访问方式。

或者

项目的web.xml中,文末加入安全约束配置

<security-constraint>

<web-resource-collection>

<web-resource-name>sign_in</web-resource-name>

<url-pattern>/sign_in</url-pattern>

<url-pattern>/XXX</url-pattern>

</web-resource-collection>

<user-data-constraint>

<transport-guarantee>CONFIDENTIAL</transport-guarantee>

</user-data-constraint>

</security-constraint>

注意上述配置,/sign_in 和 /XXX 是强制被配置的这些链接SSL访问方式。

详细的参数含义请自行搜索。

需要注意的是,将URL映射设为/*,这样你的整个应用都要求是 HTTPS 访问,而 transport-guarantee 标签设置为 CONFIDENTIAL 以便使应用支持 SSL。

如果你希望关闭 SSL ,只需要将 CONFIDENTIAL 改为 NONE 即可。

3、ssl在nginx中的简化版配置

如果你在申请前已经生成.key文件,导出私钥步骤请忽略。

导出私钥(key)

Nginx和Tomcat不一样,它要求的是证书文件 .crt 和私钥 .key 。遗憾的是,我们的私钥在keystore里面,而JDK自带的keytool并不提供私钥的导出功能,所以我们得借助第三方工具来导出私钥。

有一个开源的私钥导出工具叫做 JAVA-exportpriv 。它是一个简单的java程序,你下载以后参考它的说明编译执行。

创建certificate chain

和Apache不一样,Nginx没有Certificat Chain这个参数,如果你下载的是.crt证书,且对方有中间证书,则需要把你的证书和中间证书合并。合并证书很简单,创建一个新的文件 linuxde-chain.crt,内容如下:

-----BEGIN CERTIFICATE-----

这里是你证书的内容

-----END CERTIFICATE-----

-----BEGIN CERTIFICATE-----

这里是中间证书的内容

-----END CERTIFICATE-----

以本例中godaddy的证书为例,合并中间证书和你的证书

cat xxxxxx.crt gd_bundle-g2-g1.crt >> 你的别名-chain.crt

配置nginx.conf

server {

listen 80; #http端口监听,若放弃http请删除,并配置rewrite试http自动回写成https

listen 443 ssl; #此处同ssl on配合,若需要http和https并存,则ssl字样配置此处;若只需要https,则此处不加ssl,且开放后边ssl on配置。

#ssl on; #这行开放,则http访问会报400错,若需要http与https并存,注销此行,将ssl写到listen 443后边

server_name dev.myweb.com;

ssl_certificate /etc/nginx/sslfile/myweb.chain.crt;

ssl_certificate_key /etc/nginx/sslfile/myweb.key;

location / {

#include proxy.conf;

proxy_pass https://xxx; #也可以走upstream。若tomcat并非监听80和443,则需要配置两个upstream和两个server,两个server分别处理http和https

}

}

SSL在tomcat上的配置,nginx上的简单配置 及其注意事项

相关推荐