转载:
https://blog.csdn.net/dwyane__wade/article/details/80350548
参考文档:
https://blog.csdn.net/p793049488/article/details/53422195
补充如下内容:
步骤五:证书安装
安装方式一:
双击server.cer文件,按照提示安装证书
将证书填入到“受信任的根证书颁发机构”。具体方法:(我用的谷歌浏览器):
其他浏览器将证书填入到“受信任的根证书颁发机构”:
安装方式二:
点击客户端证书client.p12 直接安装或者导入即可,导入过程中需要输入密码,该密码是使用命令行生成证书时输入的密码。
IE:设置》内容》证书》个人》导入证书即可。
Google: 安装及查看证书,设置-》高级-》安装证书-》双击该选项-》个人选项》导入证书即可。
360: 设置-》安全设置-》https证书管理-》个人》导入证书即可。
火狐:设置》高级》证书》查看证书》个人》导入证书即可。
证书安装完成后,配置tomcat服务,通过启动tomcat服务后就可以使用了。
选择当前用户即可。
导入完成后,进入浏览器查看安装的证书详情。
注意:
1、这里安装的证书都是PKCS12类型,文件是已xxx.p12结尾证书才可以导入,如果不是该类型,则需要自行转换。
2、服务端:需要安装服务器端证书,客户端直接安装客户端认证。为了能很好的测试,我们将服务端,客户端全部安装到浏览器。
步骤六:配置Tomcat服务器
server.xml配置方式1:
属性说明:
clientAuth:设置是否双向验证,默认为false,设置为true代表双向验证
keystoreFile:服务器证书文件路径
keystorePass:服务器证书密码
truststoreFile:用来验证客户端证书的根证书,此例中就是服务器证书
truststorePass:根证书密码
server.xml配置方式2:
参数说明:
keystoreFile证书路径。
keystorePass设置证书密码。
ciphers设置这个参数,避免chrome浏览器由于安全机制过滤,提示“服务器的瞬时 Diffie-Hellman 公共密钥过弱”。
tomcat8及以上版本,协议配置为:protocol=“org.apache.coyote.http11.Http11NioProtocol”
注意:
① 设置clientAuth属性为True时,需要手动导入客户端证书才能访问。
② 要访问https请求 需要访问8443端口,访问http请求则访问Tomcat默认端口(你自己设置的端口,默认8080)即可。
浏览器访问:
http://localhost:1111/ 访问http端口会自动跳转到https端口认证。需要在server.xml中配置.
https://localhost:8443/ 访问时会弹出认证请求,选择个人证书确定即可。
springboot配置ssl(证书为JKS格式,或者.keystore文件)
1、项目结构:
4.0.0
com.example.https
springboot-https
0.0.1-SNAPSHOT
springboot-https
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter-parent
2.0.0.RELEASE
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
3、修改配置文件application.properties
将tomcat.keystore拷贝到项目src/java/resources目录下.配置application.properties
#端口号
server.port=8443
#你生成的证书名字
server.ssl.key-store=tomcat.keystore
#密钥库密码
server.ssl.key-store-password=123456
server.ssl.keyStoreType=JKS
server.ssl.keyAlias:tomcat
4、增加https认证
package com.example.https.springboothttps.config;
import org.apache.catalina.connector.Connector;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class HttpsConfig {
/* springboot 1.x配置
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint(“CONFIDENTIAL”);
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
tomcat.addAdditionalTomcatConnectors(redirectConnector());
return tomcat;
}
private Connector redirectConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(80);
connector.setSecure(false);
connector.setRedirectPort(443);
return connector;
}
*/
//下面是2.0的配置,1.x请搜索对应的设置
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
tomcat.addAdditionalTomcatConnectors(createHTTPConnector());
return tomcat;
}
// @Value("${httpPort}")
// private int httpPort;
private Connector createHTTPConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
//同时启用http(8080)、https(8443)两个端口
connector.setScheme("http");
connector.setSecure(false);
connector.setPort(8081);
connector.setRedirectPort(8443);
return connector;
}
}
测试https认证
启动服务测试,同时支持8080 https访问,也支持8081 http访问。
访问http://localhost:8080/index
访问 http://localhost:8081/index
Keytool详解
keytool常用命令
-alias 产生别名
-keystore 指定密钥库的名称(就像数据库一样的证书库,可以有很多个证书,cacerts这个文件是jre自带的,你也可以使用其它文件名字,如果没有这个文件名字,它会创建这样一个)
-storepass 指定密钥库的密码
-keypass 指定别名条目的密码
-list 显示密钥库中的证书信息
-v 显示密钥库中的证书详细信息
-export 将别名指定的证书导出到文件
-file 参数指定导出到文件的文件名
-delete 删除密钥库中某条目
-import 将已签名数字证书导入密钥库
-keypasswd 修改密钥库中指定条目口令
-dname 指定证书拥有者信息
-keyalg 指定密钥的算法
-validity 指定创建的证书有效期多少天
-keysize 指定密钥长度
使用说明:
导入一个证书命令可以如下:
keytool -import -keystore cacerts -storepass 666666 -keypass 888888 -alias alibabacert -file C:\alibabajava\cert\test_root.cer
其中-keystore cacerts中的cacerts是jre中默认的证书库名字,也可以使用其它名字
-storepass 666666中的666666是这个证书库的密码
-keypass 888888中的888888是这个特定证书的密码
-alias alibabacert中的alibabacert是你导入证书的别名,在其它操作命令中就可以使用它
-file C:\alibabajava\cert\test_root.cer中的文件路径就是要导入证书的路径
浏览证书库里面的证书信息,可以使用如下命令:
keytool -list -v -alias alibabacert -keystore cacerts -storepass 666666
要删除证书库里面的某个证书,可以使用如下命令:
keytool -delete -alias alibabacert -keystore cacerts -storepass 666666
要导出证书库里面的某个证书,可以使用如下命令:
keytool -export -keystore cacerts -storepass 666666 -alias alibabacert -file F:\alibabacert_root.cer
要修改某个证书的密码(注意:有些数字认证没有私有密码,只有公匙,这种情况此命令无效)
这个是交互式的,在输入命令后,会要求你输入密码
keytool -keypasswd -alias alibabacert -keystore cacerts
这个不是交互式的,输入命令后直接更改
Keytool -keypasswd -alias alibabacert -keypass 888888 -new 123456 -storepass 666666 -keystore cacerts
认证问题
解决Chrome浏览器不能访问https网站的问题,
使用Chrome访问https网站时,可能会出现以下错误,本文说明如何解决此类问题:
“您的连接不是私密连接”、“NET::ERR_CERT_AUTHORITY_INVALID”、“ERR_CERT_COMMON_NAME_INVALID”或“NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM”
参考文档:
http://sh.qihoo.com/pc/9749f0afe8716e56c?cota=4&tj_url=xz&sign=360_e39369d1&refer_scene=so_1
源码:https://gitee.com/com_1057718341/springboot-master/tree/master/springboot-master/springboot-https