局域网搭建SSL,使用HTTPS服务教程
1 相关证书文件格式
1.1 .csr(证书请求文件)
.csr 是证书请求文件(certificate signing request),是由 RFC 2986定义的PKCS10格式,包含部分/全部的请求证书的信息,比如,主题, 机构,国家等,并且包含了请求证书的公玥,这些被CA中心签名后返回一张证书。返回的证书是公钥证书(只包含公玥不含私钥)
1.2 .pem(容器格式,证书的加密格式)
.pem 是一种容器格式,可能仅包含公钥证书,也可以包含完整的证书链(包括公玥,私钥,和根证书)。也可能用来编码 CSR文件。
1.3 .key(私钥文件,私钥的加密格式)
.key 其实就是一个pem格式只包含私玥的文件,.key 作为文件名只是作为一个明显的别名。
pem和key 这两种格式 分别存储的是证书base64加密和私钥base64加密还有格式分割符,也就是说pem存的是证书,key 存的是私钥
1.4 .pkcs12 .pfx .p12(公私钥、证书)
pkcs即 RSA定义的 公玥密码学( Public-Key Cryptography Standards)标准,有多个标准 pkcs12只是其一,是描述个人信息交换语法标准。 有的文件直接使用其作为文件后缀名。这种文件包含公钥和私钥证书对,跟pem文件不同的是,它的内容是完全加密的。 用openssl可以把其转换成包含公玥和私玥的 .pem 文件。命令: openssl pkcs12 -in file-to-convert.p12 -out converted-file.pem -nodes
1.5 .der(一种编码方案)
其实der不是一种文件格式。der 是ASN.1 众多编码方案中的一个,使用der编码方案编码的pem文件。der 编码是使用二进制编码,一般pem文件使用的是base64进行编码,所以完全可以把der编码的文件转换成pem文件,命令: openssl x509 -inform der -in to-convert.der -out converted.pem 使用der编码的pem文件,后缀名可以为.der,也可以为以下格式:
1.6 .cert .cer .crt(证书)
pem或者der编码格式的证书文件,这些文件后缀名都会被windows 资源管理器认为是证书文件。有趣的是, .pem 反而不会被认为是证书文件。
1.7 .crl(证书吊销列表)
certificate revocation list,证书吊销列表
2 实战(SpringBoot+tomcat)
2.1 创建证书
jdk自带的keytool可以帮助我们生成证书
- win+R输入cmd打开命令行
keytool -genkey -alias tomcat -storetype PKCS12-keyalg RSA-keysize 2048-keystore keyword.p12 -validity 3650
输入密码(
密码是隐藏的,直接输入即可
),剩下的可以不输,直接全部回车,执行完之后会在当前文件夹内生成一个keyword.p12的文件
2.2 拷贝证书到项目,并配置
- 拷贝证书到resources目录下
- 在pom.xml中进行配置
放到<build>标签下
<resources><resource><directory>src/main/resources</directory><filtering>true</filtering><excludes><exclude>**/*.p12</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>**/*.p12</include></includes></resource></resources>
- 配置application.properties
#SSL
server.ssl.key-store=classpath:keyword.p12
server.ssl.key-store-password=cmd窗口时设置的密钥库口令
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias=tomcat
2.3 添加配置类,重定向将http转为https
- 在application.properties中添加配置
http.port=8080
server.port=8090
2. 添加配置类
@ConfigurationpublicclassHttpToHttpsConfigextendsWebMvcConfigurerAdapter{@Value("${server.port}")privateint serverPort;@Value("${http.port}")privateint serverHttpPort;/**
* 解决跨域问题
* @param registry
*/@OverridepublicvoidaddCorsMappings(CorsRegistry registry){
registry.addMapping("/**")// 设置允许跨域请求的域名// .allowedOrigins("*") // 注意此处,当allowCredentials为ture时候,此处不能有*.allowedOriginPatterns("/**")//是否允许证书.allowCredentials(true).allowedOrigins("*").allowedMethods("GET","POST","OPTIONS","PUT").allowedHeaders("Content-Type","X-Requested-With","accept","Origin","Access-Control-Request-Method","Access-Control-Request-Headers","accessToken").exposedHeaders("Access-Control-Allow-Origin","Access-Control-Allow-Credentials").maxAge(3600);}@BeanpublicServletWebServerFactoryservletContainer(){TomcatServletWebServerFactory tomcat =newTomcatServletWebServerFactory(){@OverrideprotectedvoidpostProcessContext(Context context){SecurityConstraint securityConstraint =newSecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");SecurityCollection collection =newSecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);}};
tomcat.addAdditionalTomcatConnectors(initiateHttpConnector());return tomcat;}privateConnectorinitiateHttpConnector(){Connector connector =newConnector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");//需要重定向的http端口
connector.setPort(serverHttpPort);
connector.setSecure(false);//设置重定向到https端口
connector.setRedirectPort(serverPort);return connector;}}
2.4 测试效果
- 编写一个简单的controller
@RestControllerpublicclassTestController{@GetMapping("/test")publicStringtestHttps(){return"success...";}}
- 浏览器输入url,回车,查看结果
http://localhost:8080/test
3 Nginx搭建https服务(linux)
3.1 安装Nginx
搭建nginx之前,我们需要先让linux服务器上有nginx
# 查看当前电脑上是否有nginx
find /-name "nginx"
如果没有,可通过以下步骤来安装nginx:
nginx安装的时候不指定安装目录,会默认安装到/usr/local/nginx下
- 安装所需依赖
yum -yinstall gcc zlib zlib-devel pcre-devel openssl openssl-devel
- 下载nginx
mkdir /temp
cd /tmp/
wget http://nginx.org/download/nginx-1.13.7.tar.gz
- 解压nginx
tar-xvf nginx-1.13.7.tar.gz
- 创建目标文件夹
mkdir-p /usr/zi/nginx
- 进入压缩包所在路径,并指定编译路径
cd /tmp/nginx-1.13.7
./configure --prefix=/usr/zi/nginx
make&&makeinstall
此时在/usr/zi/nginx下将会生成conf、sbin等文件夹
- 指定配置文件
/usr/zi/nginx/sbin/nginx -c /usr/zi/nginx/conf/nginx.conf
- 关闭防火墙
systemctl stop firewalld
# 关闭防火墙开机自启动
systemctl disable firewalld
- 启动nginx
/usr/zi/nginx/sbin/nginx -s reload
如果出现:nginx: [error] invalid PID number “” in “/usr/zi/nginx/logs/nginx.pid”,指定配置文件路径,然后重启nginx
# 指定nginx配置文件路径
/usr/zi/nginx/sbin/nginx -c /usr/zi/nginx/conf/nginx.conf
# 重启nginx
./nginx -s reload
- 在浏览器直接输入自己的ip,回车,出现
Welcome to nginx!
则表示nginx运行成功
3.2 nginx添加SSL模块
在添加模块之前,首先查看nginx是否有SSL模块
# 进入nginx的sbin目录(根据自己的位置,修改路径)cd /usr/zi/nginx/sbin
# 查看是否有ssL模块【注意,是大写的V,小写的是显示版本号】
./nginx -V
如果出现 (configure arguments: --with-http_ssl_module), 则已安装,否则需要执行下面命令安装SSL
可以看到,当前我的nginx是不存在SSL模块的,下面我将安装SSL模块。
①进入nginx源码所在位置(nginx解压缩的目录),我的是在
/tmp/nginx-1.13.7
./configure --prefix=/usr/zi/nginx --with-http_stub_status_module --with-http_ssl_module
②执行make,重新,
切记不要执行make install,否则会重新安装
make
执行结束后,在nginx的解压缩目录(我的是在
/temp/nginx-1.13.7
)将会出现
objs
文件夹,文件夹内存在nginx文件
③替换sbin目录
接下来使用新的nginx文件替换掉之前安装目录sbin下的nginx,注意这里的替换的时候可以先将之前的文件备份下,停掉nginx服务
# 进入nginx的sbin目录cd /usr/zi/nginx/nginx
# 停止服务
./nginx -s stop
# 替换sbin目录cp /temp/nginx-1.13.7/objs/nginx /usr/zi/nginx/sbin
④进入nginx安装目录,查看结果
cd /usr/zi/nginx/sbin
#注意这里是大写的V,小写的只显示版本号
./nginx -V#出现了configure arguments: --with-http_ssl_module 证明已经安装成功
3.3 给nginx配置SSL证书
①创建证书,并上传
- 拥有ssl证书,没有的可以去阿里购买或者免费申请一年【这里是内网环境,因此我们可以本地生成证书】
- 解压缩下载好的证书(证书一般是pem文件和key文件,这里名字可以随便改)
- 将下载好的证书上上传到服务器,我将证书放在了root目录下的card文件夹
jdk中内置了一个keytool
:
JDK里面内置了一个数字证书生产工具:keytool。但是这个工具只能生成自签名的数字证书。所谓自签名就是指证书只能保证自己是完整的,没有经过非法修改的。但是无法保证这个证书是属于谁的(一句话:keytool没办法签发证书,而openssl能够进行签发和证书链的管理)
我们可以在本地下载一个
openssl
工具:下载地址
下载完之后,进入安装目录的bin路径,便可以使用,当然也可以配置好环境变量,更方便。
②配置nginx的conf文件
参考文章:
https://blog.csdn.net/jasstool/article/details/98627062
https://blog.csdn.net/HD243608836/article/details/127441701
https://blog.csdn.net/xkdlzy/article/details/113380587
https://www.cnblogs.com/ambition26/p/14077773.html
版权归原作者 NPE~ 所有, 如有侵权,请联系我们删除。