购买阿里云服务器数字证书后, 使用openssl命令,编写linux shell脚本,实现自己给 客户快速颁发证书

4 篇文章 0 订阅

起因:公司项目使用了HTTPS协议,且针对不同地区的分公司需要进行划分,使用数字证书提高安全性

阿里云购买的证书:客户用浏览器打开网站,自动有小锁的标志,不会提示不安全

给客户颁发的证书:用于区分客户,不同的客户,颁发不同的证书,有密码保护安全系数高(比防火墙好的地方在于,不需要频繁配置防火墙了)

以上均为个人拙见。

参考:

spring boot https双向认证 

http://horde.i-dudu.com/t/spring-boot-https/522

SSL双向认证(高清版)

http://www.cnblogs.com/duanxz/p/4204208.html

生成证书  

https://www.alibabacloud.com/help/zh/doc-detail/32334.htm?spm=a3c0i.o32335zh.b99.52.3af623f9Er1ywL

springBoot文档链接

http://oopsguy.com/documents/springboot-docs/1.5.4/index.html#howto-configure-ssl


申请证书文件时需要填写的信息,示例如下

除了两个不填(其他的都是比较重要的信息 或者 会有默认值 )

countryName = CN  (中国
stateOrProvinceName =
localityName = Shanghai  城市
organizationName = xxxxx组织
organizationalUnitName =   组织单位
commonName = xxxxx.com   (根证书,和申请证书在此处的有些许不同;颁发者、证书路径,会展示该数据) 

emailAddress = it@xxxxx.com  邮箱


以下是摘自开头连接文章中的内容,因为我只需要给客户生成证书

1、 openssl genrsa -out rootkey.pem 2048

生成根证书的密匙。

2、 openssl req -x509 -new -key rootkey.pem -out root.crt
生成根证书。注意-x509,与步骤4和7不同。需要输入机构相关信息。

3、 openssl genrsa -out clientkey.pem 2048
生成客户端的密匙。

4、 openssl req -new -key clientkey.pem -out client.csr
生成客户端证书的请求文件。请求根证书来签发。

5、 openssl x509 -req -in client.csr -CA root.crt -CAkey rootkey.pem -CAcreateserial -days 3650 -out client.crt
用根证书来签发客户端请求文件,生成客户端证书client.crt。

6、 openssl pkcs12 -export -in client.crt -inkey clientkey.pem -out client.p12
打包客户端资料为pkcs12格式(client.p12)。需要输入密码,请记住。

7、 keytool -importkeystore -srckeystore client.p12 -destkeystore client.jks -srcstoretype pkcs12
生成客户端keystore(client.jks)。使用keytool的importkeystore指令。p12转jks。需要pkcs12密码和jks密码。

以下为生成服务端对客户端的信任文件:
8、 keytool -importcert -alias ca -file root.crt -keystore clienttrust.jks
生成Client端的对外KeyStore。先把根证书放到里面,这个是服务端用的。

9、 keytool -importcert -alias clientcert -file client.crt -keystore clienttrust.jks
把Client证书加到对外KeyStore里面,这个是服务端用的。

======================================================================

keytool -v -list -keystore  ******.jks
查看签名的信息



编写脚本简化操作

问题1.:执行shell时  报错 Text file busy

解决方案:关闭了shell连接,重新登录

问题2:执行shell却提示找不到文件

https://www.cnblogs.com/felixzh/p/6108345.html

bin/sh^M: bad interpreter: No such file or directory解决

问题:bin/sh^M: bad interpreter: No such file or directory

原因:.sh脚本在windows系统下用记事本文件编写的。不同系统的编码格式引起的。

解决方法:修改.sh文件格式
 
   (1)使用vi工具
 
      vi test.sh
 
    (2)利用如下命令查看文件格式 
     :set ff 或 :set fileformat 
     可以看到如下信息 
     fileformat= dos 或 fileformat=unix 
     (3) 利用如下命令修改文件格式 
     :set ff=unix 或 :set fileformat=unix 
     :wq (存盘退出)

拼凑shell命令,本来应该抽取参数为配置文件的,2018-03-21 00:53:35 已经凌晨了,以后有机会再优化吧

root_ca.sh 用于创建根证书,顺带查看jks文件中已有的证书

#!/bin/bash
#echo "开始创建根证书,用于给子证书授权"


#TODO 变量应该修改到配置文件中
#source openssl.conf 
#echo $localityName

#仓库密码 6位复杂密码
jks_password="zxc123456"
rootkey_pem="rootkey.pem"
root_crt="root.crt"
clienttrust_jks="client_trust.jks"

#生成密钥
if [ ! -f "${rootkey_pem}" ];then
	openssl genrsa -out ${rootkey_pem} 2048
fi
#每次生成的指纹都会不同,运行一次即可
if [ ! -f "${root_crt}" ];then
	openssl req -x509 -new -key ${rootkey_pem} -out ${root_crt} -subj "/C=CN/L=Shanghai/O=xxxxx/CN=xxxxx.com/emailAddress=it@xxxxx.com"
fi
#导入 根ca文件 生成jks文件仓库
keytool -importcert -alias root -file ${root_crt} -keystore ${clienttrust_jks} -deststorepass  ${jks_password}
echo "root CA create success!"
#查看已经信任的,证书
keytool -v -list -keystore  ${clienttrust_jks} -storepass  ${jks_password}
client_ca.sh 用于给客户生成证书,会自动添加到 client_trust.jks文件中
#!/bin/bash
#echo "开始创建子证书(需要在浏览器安装,用于鉴定用户)"

#读取配置文件
#source openssl.conf 
#echo $localityName

#导入证书时需要输入
p12_password="123456"
#组织名称
orgName="shanghai"

#仓库密码 6位复杂密码
jks_password="zxc123456"
#存放文件前缀
filePrefix="${orgName}/${orgName}"
#根证书
root_crt="root.crt"
rootkey_pem="rootkey.pem"

pem="${filePrefix}key.pem"
csr="${filePrefix}.csr"
crt="${filePrefix}.crt"
p12="${filePrefix}.p12"
jks="${filePrefix}.jks"
clienttrust_jks="client_trust.jks"


if [ ! -d "${orgName}" ];then
	mkdir ${orgName}
else
	echo "directory already exists!"
fi
#mkdir "${orgName}"
#生成密钥
openssl genrsa -out ${pem} 2048
#生成证书请求文件
openssl req -new -key ${pem} -out ${csr} -subj "/C=CN/L=Shanghai/O=xxxxx/CN=${orgName}.xxxxx.com/emailAddress=it@xxxxx.com"
#根据根证书和申请文件,生成证书
openssl x509 -req -in ${csr} -CA ${root_crt} -CAkey ${rootkey_pem} -CAcreateserial -days 3650 -out ${crt} 
#生成p12文件 需要密码
openssl pkcs12 -export -in ${crt} -inkey ${pem} -out ${p12} -passout pass:${p12_password}

#生成jks文件
keytool -importkeystore -srckeystore ${p12} -destkeystore ${jks} -destalias ${orgName} -deststorepass  ${jks_password} -srcstoretype pkcs12 -srcalias 1 -srcstorepass ${p12_password}

#将本次生成的jks文件 导入仓库
keytool -importcert -alias ${orgName} -file ${crt} -keystore ${clienttrust_jks} -deststorepass ${jks_password}

echo "client CA create success!"

两个shell的脚本耦合性还是比较高,后续再整理

使用方法

1.粘贴代码,创建shell文件( chmod +x xxxx.sh 修改执行权限)

2.先运行    ./root_ca.sh

3.再运行    ./client_ca.sh

出现提示 按Y键  回车即可

生成的证书 .p12结尾的文件传给客户,client_trust.jks配置在springBoot中

client_ca.sh 是给上海分公司生成了一个证书,其中的邮箱,组织名称等按照自己的需要进行修改

如有错误之处,还望指正!

至于为什么不配置 服务器端的证书,是因为公司已经购买了阿里云的证书,所以就省略了这一步

后续将贴出nignx配置和springBoot配置

===================================

在照着“spring boot https双向认证”这篇文章中的配置时,eclipse有报错,

Error - trustAnchors parameter must be non-empty

这个报错好像是证书配置错了,具体细节没深究,我重新跟着文章生成证书,确认配置文件后就没这个问题了

Cannot recover key

查看.p12证书文件命令

keytool -v -list -keystore ****.p12

输入密码后就能看到别名为数字 1

参考下面的springBoot配置

==============================================

这个参数需要配置在springBoot.yml配置文件

server:
  port: 8002
  ssl:
    key-store: classpath:ssl/阿里云提供的证书文件.pfx
    key-store-password: *****阿里云提供的密码****
    keyStoreType: PKCS12
   
 #   key-password: 123456 # .p12文件的 导入密码
 #   key-store: classpath:ssl/server.jks
 #   key-store-password: zxc123456
 #   keyStoreType: JKS
 #   key-alias: 1
    trust-store: classpath:ssl/client_trust.jks
    trust-store-password: zxc123456
    trustStoreType: JKS
    client-auth: need

nginx中的 server配置

server {
        listen       4433;
        server_name  localhost;
			ssl on;
			ssl_certificate      cert/阿里云证书.pem;
			ssl_certificate_key  cert/阿里云证书.key;
			ssl_session_timeout 5m;
			ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
			ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
			ssl_prefer_server_ciphers on;
		 
			ssl_client_certificate cert/root.crt;
			ssl_verify_client on;
        location / {
	    root   C:/Users/Administrator/git/web;
            index  index.html index.htm;
        }
		
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值