怎样给一个网站办法安全证书呢?以tomcat为例,我们正常访问localhost:8080都是不安全的网站,那么怎样使得这个网站安全呢?
首先我先全局说一下,我们需要先下载openssl,然后使用openssl下载和配置我们需要的证书,也就是证书三件套,配置本地的CA证书,Server证书以及Client证书!到时候你就发现三种证书配置的方式差不多
接下来正式开始从第一部讲解:首先下载openssl,下载的方式有两种,一种是源码自己配置,还有一种是大牛给你配好了.exe执行文件,我们无脑next就好:
http:
这里我们使用两个箭头的都可以,搭建可能会问第一个和第一个大小相差那么大,为什么下载第一个,因为第二个是给专业人员用的,我们只需要下载几MB的就好,我选择的是1.1.1这个版本,至于为什么不选3.0.0等等说
下载好了之后,我们需要安装在自己的目录:
然后为其添加环境变量:(系统变量下面的PATH)
然后再cmd里面:openssl version
下一步我们找到我们的openssl安装位置,右键点击openssl.exe,以管理员身份运行!(就是这里我第一次下载3.0.0每次一点这个.exe就一闪而过…还不知道怎么解决)
然后就是一顿固定操作:(温馨提示:在你配置到下面有三步都是生成文件那个,你必须生成一个然后quit退出重新打开.exe生成一个然后再退出再打开!不知道为啥)
1:生成服务端私钥:genrsa -out server.key 1024
2:生成服务端公钥:rsa -in server.key-pubout -out server.pem
3:生成客户端公钥:rsa -inclient.key -pubout -out client.pem
4:生成CA私钥:genrsa -out ca.key 1024
5:生成CA请求文件:opensslreq-new-keyca.key-outca.csr
注意:
State、Organization相关内容在生成客户端和服务器端证书的时候
也需要填写,但不要写成一样的,可以随意写如:myca,、myse,、mycl
CommonName这一项,是最后可以访问的域名,因为是在本机,所以写成localhost,后面生成客户端和服务器端证书的时候也需要 写成localhost
6:生成CA证书:x509 -req -inca.csr -signkey ca.key -out ca.crt
7:生成服务端请求文件: req -new -key server.key -out server.csr
8:向自己的CA机构申请证书,签名过程需要CA的证书和私钥参与,最终颁发一个带有CA签名的证书:x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -inserver.csr -out server.crt
9:生成客户端请求文件:req -new -key client.key -out client.csr
10:同样向CA机构申请证书:x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -inclient.csr -out client.crt
11:转化为.p12格式的文件pkcs12 -export -in ca.crt -inkey ca.key -out ca.p12
12:导出server.p12格式文件:pkcs12 -export -in server.crt -inkey server.key- out server.p12
导出client.p12格式文件:pkcs12 -export -in client.crt -inkey client.key -out client.p12
13:?将server.p12文件转化为jks文件:keytool -importkeystore -keyalgEC -srckeystore server.p12 -destkeystore server.jks -srcstoretype pkcs12
通过上面的步骤我们会得到server.jks
差不多生成了这么多东西,然后我们将server.jks拷贝到tomcat的conf文件夹下,然后修改一下server.xml:
改成这个样子以后,我们将生成的ca.p12和client.p12分别导入浏览器:我以chorm为例:
红箭头标注的是几个需要注意的点:
其实这里我多了一步就是windows+R键输入mmc:然后将两个localhost拖到受信任的根证书颁发机构下面
然后再谷歌访问https//localhost:8443:
使用ie访问:
成功!
常用的openssl命令:
格式转换
PEM私钥转PKCS#8
openssl pkcs8 -topk8 -in mysite.key -out mysite.pk8 -outform PEM
PKCS#8转PEM
openssl rsa -in mysite.pk8 -out mysite.key
PEM转PKCS12
openssl pkcs12 -export -inkey mysite.key -in mysite.pem -nodes -out mysite.p12(输出不带口令的p12证书)
openssl pkcs12 -export -inkey mysite.key -in mysite.pem -passout pass:123456 -out mysite.p12 (输出带口令的p12证书)
P12转证书
openssl pkcs12 -in mysite.p12 -nokeys -out mysite.pem
openssl pkcs12 -in mysite.p12 -nokeys -passin pass:123456 -out mysite.pem (p12文件带口令的情况)
P12转私钥
openssl pkcs12 -in mysite.p12 -nocerts -nodes -out mysite.key (输出不加密的私钥)
openssl pkcs12 -in mysite.p12 -nocerts -passout pass:123123 -out mysite.key (输出加密后的私钥)
openssl pkcs12 -in mysite.p12 -nocerts -passin pass:123456 -passout pass:123123 -out mysite.key (p12文件带口令的情况)
密钥操作
生成密钥
genrsa
openssl genrsa -out rsa.key 2048(私钥不带密码)
openssl genrsa -out rsa.key -aes256 -passout pass:123456 2048(私钥带密码)
ecparam
openssl ecparam -name CN-GM-ECC -out sm2.param
openssl ecparam -in sm2.param -out sm2.key -genkey -noout
genpkey
openssl genpkey -algorithm RSA -out rsa.key -pkeyopt rsa_keygen_bits:2048
openssl genpkey -parafile sm2.param -out sm2.key
``
不带密码的私钥==>带密码的私钥
openssl rsa -in rsa.key -out xxx.key -aes256 -passout pass:123456
openssl ec -in sm2.key -out xxx.key -sm4 -passout pass:123456
带密码的私钥==>不带密码的私钥
openssl rsa -in xxx.key -passin pass:123456 -out yyy.key
openssl ec -in xxx.key -passin pass:123456 -out yyy.key
pkey加解密私钥
openssl pkey -in rsa.key -out rsa_enc.key -des3 -passout pass:1234
openssl pkey -in rsa_enc.key -out rsa.key -passin pass:1234
从密钥对提取公钥
openssl rsa -in chen.key -pubout -out chen_pub.key
非对称加密
签名
openssl pkeyutl -sign -inkey rsa.key -in rsa.dat -out sign.dat
验签
openssl pkeyutl -verify -certin -inkey rsa.pem -in rsa.dat -sigfile sign.dat
openssl pkeyutl -verify -inkey rsa.key -in rsa.dat -sigfile sign.dat
加密
openssl pkeyutl -encrypt -inkey rsa.key -in rsa.dat -out enc.dat
解密
openssl pkeyutl -decrypt -inkey rsa.key -in enc.dat -out source.dat
pkcs7
签名
openssl smime -sign -in short.dat -signer rsa.pem -inkey rsa.key -out rsa.sig -outform PEM -nodetach -binary -md sha256
验签
openssl smime -verify -CAfile rsa-ca.pem -signer rsa.pem -in rsa.sig -inform PEM -noverify -content short.dat -binary
加密
openssl smime -encrypt -sha1 -in long.dat -outform PEM -out rsa.env -binary rsa.pem
解密
openssl smime -decrypt -in rsa.env -out rsa.plain -inkey rsa.key -inform PEM -binary
这个任务也是自己很用心的去解决问题,得出的结论就是,你要用用于尝试,不要害怕这个指令对不对,只要记录好自己的每一步,就渐勇敢往前冲,感觉出错到了无法挽回的地步就全部卸载删除,重新换一个版本继续,通过最近这几次的任务,我发现我逐渐自信起来,遇到问题居然一点点也不慌,哪怕完全没有头绪想了很久很久,我心里一直有一种神秘的直觉就是:我一定会解决这个问题是,只不过需要一点点时间!加油吧!
|