openssl生成自签名证书

操作环境

  1. 修改openssl配置文件

/etc/pki/tls/openssl.cnf

[ CA_default ]
req_extensions = v3_req

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth

[ v3_server_client ]
basicConstraints        = critical, CA:FALSE
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid:always, issuer:always
keyUsage                = critical, nonRepudiation, digitalSignature, keyEncipherment, keyAgreement
extendedKeyUsage        = critical, serverAuth, clientAuth

[ v3_sign ]
basicConstraints        = critical, CA:FALSE
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid:always, issuer:always
keyUsage                = critical, digitalSignature
extendedKeyUsage        = critical, codeSigning

[ v3_ca ]
basicConstraints = critical, CA:true
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
keyUsage = cRLSign, keyCertSign

强烈提醒:如果是要做客户端证书认证,证书类型一定要选v3_server_client

X.509 v3证书定义的扩展为用户或公钥以及在CA间的管理提供了额外的功能。X.509 v3证书的格式允许组织使用私有的扩展。 证书中的扩展被定义为critical或non-critical。一个使用证书的系统在接收到设置为critical但无法识别或无法处理的证书时, 必须拒绝处理该证书。一个non-critical的证书在无法识别时可能会被忽略。

  • 约束1:主机已经安装了OpenSSL,版本号1.0.2
  • 约束2:生成CA根证书前,请提前规划以下环境配置参数。
export root_key_password=cloudops@xncoding12_root_key;     #CA根私钥口令
export root_p12_password=cloudops@xncoding12_root_p12;     #CA根证书库PKCS12口令
export server_key_password=cloudops@xncoding12_server_key; #服务证书私钥口令
export server_p12_password=cloudops@xncoding12_server_p12; #服务证书库口令
export sign_key_password=cloudops@xncoding12_sign_key;     #签名证书私钥口令
export server_ip=192.168.210.113;                        #服务所在机器IP地址
  1. 初始化文件
CA_WORK_DIR=/etc/pki/CA

cd ${CA_WORK_DIR}
mkdir csr/ certs/ private/   #创建证书请求、证书、私钥文件夹
touch index.txt              #生成证书索引数据库文件
touch crlnumber              #吊销序列号文件

生成CA根证书

3.创建CA根私钥并指定加密密钥(PKCS8格式) 推荐做法是不要在命令行里面写密码,提示密码输入更佳

(umask 077; openssl genrsa -aes256 -passout pass:${root_key_password} -out private/root.key 3072)

4.生成自签名X509 V3 CA根证书

req是证书请求的子命令,-x509表示输出证书,-days365 为有效期,此后根据提示输入证书拥有者信息

openssl req -x509 -days 3650 -sha256 -key private/root.key -passin pass:${root_key_password} -out root.crt \
-subj "/C=CN/ST=SX/L=XA/O=xncoding/OU=GTS/CN=ca.xncoding.com/emailAddress=ca@xncoding.com"
DN字段名缩写说明填写要求
Country NameC证书持有者所在国家必填。要求填写国家代码,用2个字母表示
State or Province NameST证书持有者所在州或省份可省略不填,填写全称
Locality NameL证书持有者所在城市可省略不填
Organization NameO证书持有者所属组织或公司可省略不填
Organizational Unit NameOU证书持有者所属部门可省略不填
Common NameCN证书持有者的通用名必填。对于非应用证书,它应该在一定程度上具有惟一性;对于应用证书,一般填写服务器域名或通配符样式的域名。
Email AddressemailAddress证书持有者的通信邮箱可省略不填
  1. 导出根证书为PKCS12格式(不推荐)
openssl pkcs12 -export -inkey private/root.key -passin pass:${root_key_password} \
-in root.crt -out root.p12 -name caroot -password pass:${root_p12_password}
  1. 仅导出根证书为PKCS12格式(无私钥)

为了安全起见,给客户端使用的都应该是这种不带私钥的根证书库

keytool -importcert -noprompt -alias caroot -file root.crt -keystore root.p12 -storetype PKCS12 -storepass ${root_p12_password}
keytool -list -v -keystore root.p12 -storepass ${root_p12_password}
openssl pkcs12 -in root.p12 -nodes -passin pass:${root_p12_password}
  1. 添加其他根证书到当前PKCS12根证书库中
keytool -importcert -noprompt -alias camo -file root_mo.crt -keystore root.p12 -storetype PKCS12 -storepass ${root_p12_password}

签发服务证书

  1. 生成Server私钥

生成RSA私钥(使用aes256加密)

(umask 077; openssl genrsa -aes256 -passout pass:${server_key_password} -out private/server.key 3072)

从私钥导出公钥文件(可选)

openssl rsa -in private/server.key -passin pass:${server_key_password} -pubout -out server.pub
  1. 生成证书请求

使用RSA私钥生成CSR签名请求

openssl req -new -extensions v3_server_client -key private/server.key -passin pass:${server_key_password} -out csr/server.csr \
-subj "/C=CN/ST=SX/L=XA/O=xncoding/OU=DC/CN=${server_ip}/emailAddress=cloudops@xncoding.com" \
-config /etc/pki/tls/openssl.cnf
  1. 生成服务的X509证书
openssl x509 -req -extensions v3_server_client -days 3650 -sha256 -CAcreateserial -CA root.crt \
-CAkey private/root.key -passin pass:${root_key_password} -in csr/server.csr -out certs/server.crt \
-extfile /etc/pki/tls/openssl.cnf

注-CAcreateserial 会在本地创建一个cacert.srl文件,此后会依据这个文件中的序列号对证书进行序列号递增。

9.查看证书中的信息 通过指定不同的参数参考证书不同的内容,比如-text表示查看证书全部内容,-issuer查看证书签发者

openssl x509 -in certs/server.crt -noout -text|issuer|subject|serial|dates

10.利用CA根证书校验证书

openssl verify -verbose -CAfile root.crt certs/server.crt

11.查询序列号

openssl x509 -in certs/server.crt -noout -serial | awk -F= '{print $2}'

13.导出服务证书为PKCS12格式

# 导出包含根证书的证书链
openssl pkcs12 -export -inkey private/server.key -passin pass:${server_key_password} \
-in certs/server.crt -chain -CAfile root.crt -out certs/server.p12 -password pass:${server_p12_password} 

证书吊销

  1. 在Server端获取要吊销的证书序列号
openssl x509 -in certs/server.crt -noout -serial -subject

结果显示:

serial=85E9F229A3C91591
subject= /C=CN/ST=SX/L=XA/O=xncoding/OU=DC/CN=dc.xncoding.com/emailAddress=server@xncoding.com

CA中心

14.根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致。或者执行同样的命令查看证书信息是否一致。

15.如果信息一致则执行吊销动作

openssl ca -revoke certs/server.crt -keyfile private/root.key -passin pass:${ca_key_password} -cert root.crt

16.更新吊销列表

echo ${SERIAL} > crlnumber #这个只需要在第一次更新证书吊销列表前,才需要执行
openssl ca -gencrl -keyfile private/root.key -passin pass:${ca_key_password} -cert root.crt -out crl/crl.crt

17.查看吊销列表:

openssl crl -in crl/crl.crt -noout -text
openssl crl -in crl/crl.crt -noout -text | grep "Serial Number:" | awk 'BEGIN{FS=": "} {print $2}'

Server端

-------------------------------下面是证书导出/导入--------------------------------

18.导出pkcs#12证书

-export表示导出pkcs#12 证书,-inkey 指定了私钥文件,-passin 为私钥口令(nodes为无加密),-password 指定 p12文件口令(导入导出)

openssl pkcs12 -export -inkey private/server.key -passin pass:${server_key_password} \
-in server.crt -password pass:${server_p12_password} -out certs/server.p12

19.导出pkcs#12证书链

openssl pkcs12 -export -inkey private/server.key -passin pass:${server_key_password} \
-in certs/server.crt -chain -CAfile root.crt -out certs/server.p12 -password pass:${server_p12_password} 
  1. 将.p12文件导入到keystore文件server.jks
keytool -importkeystore -v -srckeystore certs/server.p12 -srcstoretype pkcs12 -srcstorepass ${server_p12_password} \
-destkeystore certs/server.jks -deststoretype jks -deststorepass ${server_jks_password}
  1. 从keystore中导出pk12文件
keytool -importkeystore -srckeystore server.jks -destkeystore server.p12 -srcstoretype JKS \-deststoretype PKCS12 \
-srcstorepass ${server_p12_password} -deststorepass ${server_jks_password} -srcalias 1 -destalias tomcat -srckeypass 333333 \
-destkeypass 555555 -noprompt

将一个外部证书和私钥导入已存在的p12文件中:

openssl pkcs12 -export -inkey client.key.pem -in client.crt.pem -password pass:666666 -out client.p12

keytool -importkeystore -deststorepass cloudops@xncoding12_server_p12 -destkeypass cloudops@xncoding12_server_p12 \
-destkeystore server.p12 -deststoretype PKCS12 -destalias client -srckeystore client.p12 -srcstoretype PKCS12 -srcalias 1

21.pcks#12提取

提取PEM文件(含私钥)
openssl pkcs12 -in server.p12 -password pass:${server_p12_password} -passout pass:${server_key_password} -out server.key
仅提取私钥
openssl pkcs12 -in server.p12 -password pass:${server_p12_password} -passout pass:${server_key_password} -nocerts -out server.key
openssl pkcs12 -in server.p12 -out server.key -nocerts -passin pass:changeit -passout pass:changeit
检查私钥
openssl rsa -in server.key -check
解密私钥key变成明文
openssl rsa -in server.key -out server.key
仅提取证书(所有证书)
openssl pkcs12 -in server.p12 -password pass:${server_p12_password} -nokeys -out server.crt
仅提取ca证书
openssl pkcs12 -in server-all.p12 -password pass:${server_p12_password} -nokeys -cacerts -out cacert.crt
仅提取server证书
openssl pkcs12 -in server-all.p12 -password pass:${server_p12_password} -nokeys -clcerts -out server.crt

22.Java导入信任CA根证书到JRE证书库中

$JAVA_HOME/bin/keytool -import -trustcacerts -noprompt -alias www.mydomain.com -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass ${ca_jks_password} -file ${SERVER_WORK_DIR}/cacert.crt
keytool -importcert -noprompt -alias manageone -file manageone.cer -keystore manageone.jks -storepass changeit
keytool -importkeystore -alias manageone -srckeystore "d:\libs\manageone.jks" -keystore "C:\Program Files\Java\jdk1.8.0_191\jre\lib\security\cacerts" -storepass changeit

23.Java导入信任CA根证书到普通证书库文件中 visudo中添加一条:

ca      ALL=NOPASSWD:/usr/java/jdk/bin/keytool

不管是对于jks还是p12格式的都能适用,如果证书库文件不存在则创建新的(默认jks格式)。如果存在则往里面添加,证书库格式不会改变

keytool -import -trustcacerts -noprompt -alias caroot -keystore root.jks -storepass ${ca_p12_password} -import -file root.crt

23.查看Keystore的内容

openssl pkcs12 -in certs/server.p12 -nodes -passin pass:${server_p12_password}
openssl pkcs12 -in certs/server.p12 -nodes -passin pass:${server_p12_password} | openssl x509 -noout -text
openssl pkcs12 -in certs/server.p12 -password pass:${server_p12_password} -nokeys | openssl x509 -noout -enddate
keytool -list -v -keystore root.jks -storepass ${root_p12_password}

24.Java从证书库文件中移除CA根证书

$JAVA_HOME/bin/keytool -delete -noprompt -alias caroot -keystore ca.jks -storepass ${ca_jks_password}

23.Tomcat 8 配置HTTPS访问

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true">
	<SSLHostConfig>
		<Certificate certificateKeystoreFile="conf/server.p12" certificateKeystorePassword="333333" certificateKeystoreType="PKCS12" />
	</SSLHostConfig>
</Connector>

或者是下面的配置:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled ="true" sslProtocol ="TLS" maxThreads="150"
        acceptCount="100" maxHttpHeaderSize="8192" maxKeepAliveRequests="100" scheme="https" secure="true" clientAuth="false"
        keystoreFile="conf/server.p12" keystorePass="333333" keystoreType="PKCS12"
        ciphers="SSL_ECDHE_RSA_WITH_AES_256_GCM_SHA384,SSL_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,SSL_ECDHE_RSA_WITH_AES_128_GCM_SHA256,  TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
        maxPostSize="10240" connectionTimeout="20000" allowTrace="false" xpoweredBy="false" server="WebServer" URIEncoding="UTF-8" sslEnabledProtocols="TLSv1.2,TLSv1.1"/>

------------------------------RSA加密/解密------------------------------

1)公钥加密(注意:如果使用证书加密的话,需要使用-certin选项,-inkey指定证书文件)

openssl rsautl -encrypt -in test.txt -out test.enc -inkey public.crt -pubin

2)私钥解密

openssl rsautl -decrypt -in test.enc -out test.dec -inkey private.crt

------------------------------RSA签名/验签------------------------------

PKCS1私钥转换为PKCS8

openssl pkcs8 -topk8 -inform PEM -in sign.key -outform pem -nocrypt -out sign.key

1)通过SHA256生成摘要

openssl dgst -sha256 file.txt

2)私钥签名 首先将你的文件通过摘要算法比如SHA256生成一个摘要,并对这个摘要进行私钥签名,输出签名文件

now_str=$(date +%s%3N)
# 对于OpenSSL算法库,签名时应该先调用RSA_padding_add_PKCS1_PSS进行PSS填充,
# 再对填充结果调用RSA_private_encrypt并指定RSA_NO_PADDING填充方式进行签名
# 验证签名时应该先调用RSA_public_decrypt进行公钥解密,再调用RSA_verify_PKCS1_PSS验证签名;
# https://www.jianshu.com/p/64cc65f2d04f
openssl dgst -sign sign.key -sigopt rsa_padding_mode:pss -sha256 -out sign.sha256 file.txt
openssl base64 -in sign.sha256 -out sign.txt
rm -f sign.sha256

3)公钥验证

now_str=$(date +%s%3N)
openssl base64 -d -in sign.txt -out sign.sha256
openssl dgst -verify sign.pub -sha256 -sigopt rsa_padding_mode:pss -signature sign.sha256 file.txt
rm -f sign.txt sign.sha256
  1. 证书验证 首先将证书中的公钥提取出来,后面就跟公钥验证步骤一致了
openssl x509 -pubkey -noout -in sign.crt > sign.pub

转载于:https://my.oschina.net/yidao620c/blog/3037764

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值