转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/80830959
本文出自【我是干勾鱼的博客】
我们都知道http请求是明文传输,也就意味着数据交互传输是不安全的,极有可能被截获,也有可能被篡改,使用https请求已经是一个大趋势了。今天就来讲讲通过自签名自己实现https请求的实现方法。
Ingredient:
linux: Ubuntu 18.04 LTS(cat /etc/issue)
openssl: OpenSSL 1.1.0g 2 Nov 2017(openssl version -a)
jdk:Java SE Development Kit 8u162(Oracle Java Archive)
tomcat:Tomcat 8.5.30
这里为什么还要使用jdk呢?是因为服务器端经过ca认证的证书,即“crt”类型的文件,生成出来之后,还要在使用openssl命令对其生成一个p12文件,然后就是要使用jdk的“keytool”命令针对这个“p12”类型的文件生成一个keystore类型的文件,此文件是服务器端存放证书的容器。在tomcat的:
{tomcat}/conf/server.xml
文件中,要配置好这个keystore类型文件的位置,因为tomcat在启动时会引用这个文件。
创建生成证书的文件夹并进入:
mkdir -p /opt/keys/test
cd /opt/keys/test/
openssl genrsa -des3 -out ca.key 2048
输入相应的密码设定,如图所示:
openssl req -new -x509 -days 7305 -key ca.key -out ca.crt
openssl genrsa -des3 -out www.test.com.pem 1024
如图所示:
openssl req -new -key www.test.com.pem -out www.test.com.csr
在common name中填入服务器的域名,如www.test.com即可生成改站点的证书,当然也可以使用泛域名如*.test.com来生成所有二级域名可用的网站证书。如图所示:
openssl ca -policy policy_anything -days 1460 -cert ca.crt -keyfile ca.key -in www.test.com.csr -out www.test.com.crt
这里“-days 1460”表示生成证书为期1460天(4年)。
执行这里的时候会出现如下错误:
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ca.key:
ca: ./demoCA/newcerts is not a directory
./demoCA/newcerts: No such file or directory
如图所示:
网上也有相关文章提到了解决办法,要创建一些文件夹和文件,并在其中输入“01”,代码如下:
mkdir -p ./demoCA/newcerts //当前路径下创建这两个文件夹
touch ./demoCA/index.txt //创建index.txt文件
touch ./demoCA/serial //创建serial文件
echo '01' > ./demoCA/serial //在serial文件中写入“01”
如图所示:
然后在执行创建crt签名文件的命令,就会进入授权签名的命令行,如下图所示:
注意两个地方都输入同意:y,然后crt文件就生成了。
openssl pkcs12 -export -in ./www.test.com.crt -inkey ./www.test.com.pem -out ./www.test.com.p12 -name "server"
生成一个keystore类型的文件“www.test.com.keystore”,并将.p12类型的文件导入到里面
keytool -importkeystore -v -srckeystore www.test.com.p12 -srcstoretype pkcs12 -srcstorepass 123456 -destkeystore www.test.com.keystore -deststoretype jks -deststorepass 123456
这里:
对于服务器端(这里就是tomcat了)的单向认证,需要这两个文件:
首先将:
www.test.com.keystore
放置在服务器的一个合适的位置,这里仍将它放在:
/opt/keys/test/
目录下。
这里需要配置tomcat的server.xml文件,打开tomcat的:
{tomcat}/conf/server.xml
文件,将原有的改为:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
keystoreFile="/opt/keys/test/www.test.com.keystore"
keystorePass="123456"
clientAuth="false" sslEnabledProtocols="TLSv1.2"
ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
TLS_RSA_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
TLS_RSA_WITH_3DES_EDE_CBC_SHA,
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA" />
将tomcat服务器启动。
可以直接访问域名:
https://www.test.com:8443/
或者配置了hosts文件:
192.168.12.3 www.test.com
之后在访问这个域名。
也可以直接访问ip:
https://192.168.12.3:8443/
注意这里浏览器会自动到服务器下载这个经过CA签名的证书,但是因为不是正式的CA机构颁发的,所以浏览器会任务这个证书是不安全的,如图所示:
如果使用正式CA机构认证的证书,这里就会是安全的提示了。
不过虽然标注为“不安全”,但是数据传输也都是经过了加密处理的,直接抓包是看不到明文信息的,也就达到了https请求的目的了。
为nginx配置https并自签名证书
linux下Tomcat+OpenSSL配置单向&双向认证(自制证书)
OpenSSL生成证书对