问题:bin/sh^M: bad interpreter: No such file or directory
原因:.sh脚本在windows系统下用记事本文件编写的。不同系统的编码格式引起的。
起因:公司项目使用了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
拼凑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有报错,
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;
}
}