我们公司现在使用springcloud做的微服务架构项目,默认消息流都是HTTP通道,引入HTTPS通道整体的消息流大概为:
其实总体的消息流和HTTP相比是没有变化的,只不过先放在最开始让我们梳理一下要做哪些事情。
基本概念
1、秘钥库:存储一条条的秘钥,第一次使用keytool -genkey生成的文件为一个秘钥库和一条秘钥,后续可以为这个文件(即秘钥库)继续添加秘钥
2、信任库:truststore是放服务端信任的客户端证书的一个store(或者客户端放服务端的),里存放的是只包含公钥的数字证书,代表了可以信任的证书
3、秘钥库类型:本文全部保持PCK12类型,类型可能会导致秘钥库的加密等处理方式不一样,我们使用时不会感知到
基本命令
1、查看证书库中所有的证书
keytool -list -keystore D:keykeystore2.p12 -storepass XXX
2、从证书库中导出证书
keytool -export -alias server2 -file D:keyservercert2.cer -keystore D:keykeystore2.p12
3、导入JVM信任证书
keytool -import -alias server2 -keystore "C:Program FilesJavajdk1.8.0_191jrelibsecuritycacerts" -file D:keyservercert2.cer -storepass changeit
4、同时生成秘钥库和秘钥对
keytool -genkey -alias server -keyalg RSA -storetype PKCS12 -keystore D:keykeystore4.p12 -storepass XXX -validity 36500 -ext SAN=dns:localhost,dns:abc,ip:127.0.0.1 -dname "CN=10.1.4.41,OU=csoa,O=csoa,L=FZ,ST=FZ,C=CN"
关键问题
1、alias意义:后面跟着的是秘钥对名称
2、SAN意义:后面跟着的是在哪些域名和IP生效,暂未找到怎么配置可以在任何IP和域名都生效的,所以跟随者现网的IP不通需要生成不同的证书,但是我们可以让自己的服务尽量的使用域名注册到eureka上,其他服务使用域名访问,比如下面的业务配置就是使用localhost进行注册
HTTP转HTTPS
eureka
server
关键的点有
1、server.ssl
2、eureka.instance
这边就是配置一下秘钥库,打开eureka的前天,就是HTTPS的了
zuul
server
关键配置:
1、server.ssl(配置秘钥库)
2、ribbon.IsSecure(服务访问网关之后,网关使用Ribbon进行转发,如果不配置此项,Ribbon就会使用HTTP协议转发,配置了之后就是HTTPS)
3、将证书加入到JVM信任库中
keytool -import -alias server2 -keystore "C:Program FilesJavajdk1.8.0_191jrelibsecuritycacerts" -file D:keyservercert2.cer -storepass changeit
(changeit是虚拟机默认的密码)
导入之后就可以zuul就会信任所导入的证书的服务,从而可以进行转发
4、eureka:instance:hostname: localhost不要使用IP进行注册
验证:
可以做一个网关的Filter拦截请求,看看是否生效
import
业务
和zuul几乎一样
server:
port: 9132
servlet:
context-path: /
session:
cookie:
name: OAUTH2SESSION
tomcat:
uri-encoding: UTF-8
use-forward-headers: true
ssl:
key-store: serverkeystore.p12
key-store-password: XXX
keyStoreType: PKCS12
keyAlias: server
feign:
hystrix:
enabled: true
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 60000
strategy: SEMAPHORE
ribbon:
ReadTimeout: 30000
ConnectTimeout: 60000
MaxAutoRetries: 0
MaxAutoRetriesNextServer: 1
eureka:
instance:
hostname: localhost
client:
serviceUrl:
defaultZone: https://127.0.0.1:9001/eureka/
mybatis:
config‐location: classpath:mybatis/mybatis-config.xml
logging:
config: classpath:log-config/logback.xml
关键配置
1、server.ssl(配置秘钥库)
2、将证书加入到JVM信任库中
keytool -import -alias server2 -keystore "C:Program FilesJavajdk1.8.0_191jrelibsecuritycacerts" -file D:keyservercert2.cer -storepass changeit
(changeit是虚拟机默认的密码)
导入之后就可以zuul就会信任所导入的证书的服务,从而可以进行转发
3、eureka:instance:hostname: localhost不要使用IP进行注册
问题
1、使用postman调用后台失败,Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/octet-stream' not supported](这个和HTTPS没有关系。。。。。)
2、zuul注册eurake报找不到请求目标的证书
原因:证书没有导入到JVM的证书库中
3、显示IP在证书中没有被匹配到
生成的证书没有设置ext SAN
难点
像上面说的,证书生成的时候需要指定域名和IP,如果使用IP进行服务间的调用,就需要单独生成生产环境的证书,所以尽量使用域名调用,生成证书的时候添加域名