1. 生成https证书
本方案生成证书需要java环境
1.1 Linux生成脚本
#!/bin/bash
echo -e "\033[30m服务器证书生成\033[0m"
#ip或域名
ip=127.0.0.1
if [ $# -gt 0 ]
then
ip=$1
fi
#证书密码
password=123456
#签发证书时间长度(天)
duration=365
# 清空缓存
echo "清空缓存"
rm -f server.keystore client.p12 client.cer
#生成服务端server证书
echo "生成server端证书"
keytool -genkey -alias server -keypass $password -keyalg RSA -keysize 1024 -keystore server.keystore -validity $duration -storepass $password <<!
$ip
lhDream
lhDream
lhDream
lhDream
ch
y
!
#生成用户端clinet证书 (单向验证不需要以下部分,有了也不影响)
echo "生成client端证书"
keytool -genkey -alias client -keyalg RSA -storetype PKCS12 -keystore client.p12 -keypass $password -storepass $password <<!
$ip
lhDream
lhDream
lhDream
lhDream
ch
y
!
#把客户端证书导出为一个单独的CER文件
echo "把客户端证书导出为一个单独的CER文件"
keytool -export -alias client -keystore client.p12 -storetype PKCS12 -storepass $password -keypass $password -file client.cer <<!
$password
!
#导入到服务器的证书库,添加为一个信任证书
echo "导入到服务器的证书库,添加为一个信任证书"
keytool -import -v -file client.cer -keystore server.keystore -storepass $password <<!
y
!
#"查看服务器的证书库"
echo "查看服务器的证书库"
keytool -list -v -keystore server.keystore <<!
$password
!
keytool -keystore server.keystore -export -alias server -file server.cer <<!
$password
!
1.2 windows下生成步骤
1.2.1 生成server端证书
keytool -genkey -alias server -keypass 123456 -keyalg RSA -keysize 1024 -keystore server.keystore -validity 365 -storepass 123456
>127.0.0.1(ip或域名)
>lhDream1 单位名称
>lhDream2 组织名称
>lhDream3 城市或区域名称
>hDream4 所在省/市/自治区名称
>ch 国家/地区代码
1.2.2 生成client端证书
keytool -genkey -alias client -keyalg RSA -storetype PKCS12 -keystore client.p12 -keypass 123456 -storepass 123456
>127.0.0.1(ip或域名)
>lhDream1 单位名称
>lhDream2 组织名称
>lhDream3 城市或区域名称
>hDream4 所在省/市/自治区名称
>ch 国家/地区代码
1.2.3 把客户端证书导出为一个单独的CER文件
keytool -export -alias client -keystore client.p12 -storetype PKCS12 -storepass 123456 -keypass 123456 -file client.cer
1.2.4 导入到服务器的证书库,添加为一个信任证书
keytool -import -v -file client.cer -keystore server.keystore -storepass 123456
>y
1.2.5 查看服务器的证书库(确定是否导入成功)
keytool -list -keystore server.keystore
>123456 (密码)
2. 配置tomcat
server.xml 配置开启https验证:SSLEnabled="true" 表示开启https,clientAuth="true"表示开启双向验证
<Connector port="8080" protocol="HTTP/1.1" SSLEnabled="true"
connectionTimeout="20000"
maxThreads="150"
scheme="https"
secure="true"
clientAuth="true"
sslProtocol="TLS"
keystoreFile="/opt/gbServer/lib/https/server.keystore"
keystorePass="123456"
truststoreFile="/opt/gbServer/lib/https/server.keystore"
truststorePass="123456"/>
web.xml 配置http自动转https
ps : 有时有用有时无用、等找到其他方案再改。
<login-config>
<!-- Authorization setting for SSL -->
<auth-method>CLIENT-CERT</auth-method>
<realm-name>Client Cert Users-only Area</realm-name>
</login-config>
<security-constraint>
<!-- Authorization setting for SSL -->
<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>
<!--
Require HTTPS for everything except /img (favicon) and /css.
-->
<security-constraint>
<web-resource-collection>
<web-resource-name>HTTPSOrHTTP</web-resource-name>
<url-pattern>*.ico</url-pattern>
<url-pattern>/img/*</url-pattern>
<url-pattern>/css/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
3. client端安装证书
直接运行 clinent.p12全部默认选项安装即可
之后输入 https://127.0.0.1:8080 访问网站会提示选择证书,点击确定即可正常登录
4. 异常解决
4.1 Invalid keystore format
tomcat运行环境 java版本要与 证书生成的java版本一致
解决办法: 直接将脚本放在服务器上执行 或 将本地版本与服务器一致