证书

非对称加密

公钥加密的文件可以用私钥解密,私钥加密的文件可以用公钥解密

1
2
3
4
5
6
7
8
//生成私钥
openssl genpkey -algorithm rsa -out rsa_private.key
//从私钥中提取公钥
openssl rsa -pubout -in rsa_private.key
//用私钥对文件进行加密(签名)
openssl rsautl -sign -in text -inkey rsa_private.key -out text.en
//用公钥对文件进行解密(校验)
openssl rsautl -verify -in text.en -inkey rsa_pub.key -pubin

证书

公钥信息 + 额外的其他信息(所属的实体,加密解密算法等)= 证书,证书文件的扩展名一般为crt

证书格式

  • .DER或者.CER:二进制,只包含证书信息,不包含私钥
  • .CRT:二进制或者文本
  • .PEM:文本格式,可以存放证书或者私钥,或者都包含,如只是包含私钥,一般用.KEY文件替代
  • .P12或者.PFX:二进制格式,同时包含证书和私钥,一般有密码保护
  • .JKS:二进制格式,java使用证书
1
2
3
4
5
6
7
8
9
10
11
12
//查看证书信息
openssl x509 -in apiserver.crt -noout -text
//查看客户端证书
openssl s_client -connect www.baidu.com:443
//查看证书信息
openssl x509 -in tt.key -noout -text
//导出网站的公钥
export WEB_HOST=www.taobao.com && openssl s_client -showcerts -connect ${WEB_HOST}:443 < /dev/null | openssl x509 -outform pem > ${WEB_HOST}.pem && cat ${WEB_HOST}.pem
//同上
ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect www.baidu.com:443) -scq
//同上
openssl s_client -connect www.baidu.com:443 2 > /dev/null < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'

ssh生成密钥

1
2
//使用工具生成密钥
ssh-keygen -t rsa

生成自签名证书过程

1
2
3
4
5
6
7
8
9
10
11
12
13
// 生成根证书私钥
openssl genrsa -out ca.key 2048
// 生成根证书请求文件
openssl req -new -key ca.key -out ca.csr
// 生成根证书
openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt

// 生成证书私钥
openssl genrsa -out server.key 2048
// 生成证书请求文件
openssl req -new -key server.key -out server.csr
// 创建证书
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out server.crt

java使用证书

1
2
3
4
//keytool生成密钥文件keystore
keytool -importcert -noprompt -trustcacerts -alias test -file server.cer -keystore server.jks
//导入证书到java运行环境
keytool -importkeystore -srckeystore server.jks -destkeystore ${JAVA_HOME}/jre/lib/security/cacerts