如题,看了网上一些文章,其实都还不错,只是感觉不够完整,今天自己操作了一把,特整理起来供同行们参考。
前提说明一下,配置成功https了也就可以通过wss连接了,底层应该都一样,只是wss是个长连接。
获取证书
要配置ssl证书,也就是通过https访问,首先得有个证书吧。有不太了解ssl证书、https是干啥的先去补充这方面知识,这里不做讲解。不过不了解也不妨碍可以通过这篇文章可以把你的项目搞成可通过https去访问的最终效果实现,哈哈,是不是很神奇。做我们这行就是这样,可能你不是很了解1、2、3,但最终需要10,我们也能想办法搞定。知其然,可以不知其所以然,当然我说是可以不知。如果精力允许的话最好是都搞明白。好了扯远了进入正题。
获取证书可以有两种方式,购买云服务器的从云服务厂商那获取,网上教程很多,这里不展开讲。第二种自签发证书,一般我们开发、调试的时候在本地,总不可能写一点代码往服务器部署一版吧,这里详细讲一下这种方式。
最终都是获取到一个后缀pkcs12的文件和一串密码。
从阿里、腾讯等厂商获取
自行百度,哈哈。
这里做一点说明,厂商都会提供各种格式的证书供选择,选其中那个pkcs12就好了。
自签发证书
这里讲通过openssl工具生成证书,通过这个工具有个啥好处呢,可以通过ip签发证书,我想我们开发的时候你机子不会搞个域名吧,当然你搞个dns啥的可能也行,不过感觉没必要。我是在linux服务上安装的工具,然后生成的证书,在本地使用,感觉有点绕了,应该有在本地生成的办法,欢迎有试过的小伙伴补充一下。
安装工具
通过yum安装,我这是centos系统啊,ubantu稍微有点差异。
yum install openssl openssl-devel -y
生成一个RSA密钥 (私钥)
openssl genrsa -out server.key 2048
生成一个证书请求
openssl req -new -key server.key -out server.csr -subj
"/C=CN/ST=Beijing/L=Beijing/O=power Inc./OU=Web Security/CN=192.168.5.4"
字段解读
C字段:Country,单位所在国家,为两位数的国家缩写,如:CN 表示中国;
ST 字段:State/Province,单位所在州或省;
L 字段:Locality,单位所在城市/或县区;
O 字段:Organization,此网站的单位名称;
OU 字段:Organization Unit,下属部门名称,也常常用于显示其他证书相关信息,如证书类型,证书产品名称或身份验证类型或验证内容等;
CN 字段:Common Name,替换成自己的ip;
自己签发证书
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
转换为pkcs12格式
这里会提示输入两次密码,国际惯例123456
一定要记住,稍后需要配置到项目里。
openssl pkcs12 -export -clcerts -in server.crt -inkey server.key -out server.pkcs12
这时候应该会有这几个文件
最终用到的是server.pkcs12 这个
springboot配置证书
这一步就比较简单了
拷贝证书到项目中
路径不在这也没关系,只要和后面配置的路径一致就好了。
配置
server:
port: 9083
# 当使用https时有需求同时支持http场景时http端口
# http-port: 9084
ssl:
key-store: classpath:static/server.pkcs12 #对应刚才文件放置的路径
key-store-password: 123456 #对应生成证书时的密码
key-store-type: pkcs12
这里有个点需要注意一下,就是有的小伙伴可能会发生项目读取不到证书文件的问题。看了网上好多办法需pom文件配置一些东西,个人建议如果搞不清楚所以然的话不要乱配置,可能会发生意想不到的后果哦~。
这是我pom文件,什么也没有配置:
教大家一个简单的办法,如果没有特意配置什么的话,直接在maven那clear一下大概率能解决。
启动项目
ok,效果。完美启动!
注意
好啦,访问试试吧。
写个测试接口
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/test")
public void test(String id){
System.out.println("data: "+id);
}
}
重新启动项目
浏览器输入地址访问试试
注意一定是https哦~
完,啥情况,不会搞了半天搞瞎了吧~~
别急,因为是自签发证书的原因,生产上我们肯定用大厂颁发的证书的。
所以设置一下,选择信任就好了。
不同的浏览器或工具设置方式可能不一样,不过应该都大同小异。
我用的是火狐,贴出来看一下吧
效果就是这样滴,因为测试代码,能省则省,连返回值都省了。
还是能从idea控制台看到请求成功了的。
ok,到此ssl证书配置完成。
wss也可以测试一下,
猜想到应该也是自签发证书的原因
果然被我猜中了。因为这个wss客户端工具我不知道咋设置信任自签发证书,就这样了。
另外wss服务端代码就不贴了,有点长,也不是本文的重点,网上这种例子一大堆。
总结
只要是https通了wss大概率也没问题,看到了吧,spring boot配置ssl证书很简单,业务代码一点都不需要改动,只需上面几步就搞定。
同时支持http、ws
按上面的配置完成后,以后请求只能用https了,用http是请求不到了,不信你看:
ok,有的小伙伴又来了,能不能同时支持http、ws和https、wss啊。
哎哟,还真是贪心啊,鱼与熊掌还想兼得。
好吧,其实我就是这种贪心的淫~~~ 嘿嘿~~~
上代码
/**
* @author lil
* @Description: 配置https后同时支持http
* @date 2022/7/22 9:57
*/
@Component
public class TomcatServerCustomer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
@Value("${server.http-port}")
public Integer httpPort;
@Override
public void customize(TomcatServletWebServerFactory factory) {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(httpPort);
factory.addAdditionalTomcatConnectors(connector);
}
}
加配置
要想同时支持http和https 只能分开不同的端口
看效果
启动项目
ok,完美!
啥,想一个端口实现http和https同时访问? 请你死远一些,谢谢~~~~
哈哈 开玩笑~~