• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
画地自囚工作记录
博客园    首页    新随笔    联系   管理    订阅  订阅

x509证书相关内容

什么是证书

    X.509证书,其核心是根据RFC 5280编码或数字签名的数字文档。
    实际上,术语X.509证书通常指的是IETF的PKIX证书和X.509 v3证书标准的CRL 文件,即如RFC 5280(通常称为PKIX for Public Key Infrastructure(X.509))中规定的。

证书虽然与密钥用存储的文件格式一样,都是pem或者der等,但是,证书不是密钥,证书包含公钥以及签名,拥有人等相关信息。

 

 

证书格式:

pem格式

最普通的证书格式,以-----BEGIN CERTIFICATE----- 开头,以-----END CERTIFICATE-----结尾;有些pem证书把私钥也放在了一个文件中,但是很多平台还是需求证书和私钥分开放在不同的文件中。 pem证书有以下特点:

  • base64编码;
  • 有.pem, .crt, .cer, .key文件后缀;
  • Apache等类似服务器使用pem格式证书;

der格式

der格式是pem格式证书的二进制格式,证书和私钥都可以以der格式存储。 其特点为:

  • 二进制格式;
  • 以.cer或.der格式为后缀;
  • 常被用于java平台;

PKCS#7格式

它是一种PKCS#7格式以-----BEGIN PKCS-----开头,以-----END PKCS7-----结尾,它只能保存证书或证书链,不能保存私钥。 其特点为:

  • base64编码;
  • 文件后缀为 .p7p, .p7c;
  • window或java tomcat等平台支持此类型;

PKCS#12(pfx)格式

它能把服务器证书(包括公钥),中间证书和私钥存储在一起。特点为:

  • 二进制文档;
  • 以 .pfx 或.p12为后缀;
  • 经常在windows系统内被用于导入导出证书和私钥;
  • 打开可能需要额外密码;

密钥的保存

对于密钥(单指公私钥)的保存,并不需要特殊的格式,直接将base64编码后的密钥作为字符串存入文档即可。

 

 

证书格式示例

-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----


RSA private key (PKCS#1)

-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----


RSA public key (PKCS#1)

-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----


RSA private key (PKCS#8, key 沒加密 )

-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----


RSA public key (PKCS#8)

-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----


RSA private key (PKCS#8, key 有加密 )

-----BEGIN ENCRYPTED PRIVATE KEY-----
...
-----END ENCRYPTED PRIVATE KEY-----

 证书的相关命令行操作

RSA加密操作
密钥生成和使用

openssl genrsa -out rsa_private_key.pem 1024 // 生产一个1024位的私钥, 保存在 rsa_private_key.pem 文件里

openssl rsa -in rsa_private_key.pem -pubout -out pub.pem  // 通过私钥生产公钥


格式转换
从pfx文件中提取公私钥

openssl pkcs12 -in source.pfx -nocerts -nodes -out key.key // 从pfx文件中获取到密匙对文件,有时会需要密码
opensll rsa -in key.key -out pri.key // 从密匙对文件中获取到私匙。
opensll rsa -in key.key -pubout -out pub.key // 从密匙对文件中获取到公匙;
openssl pkcs8 -in pri.key -out repri.key -outform der -nocrypt -topk8 //java语言用

各种证书之间的互相转换

PEM to DER
openssl x509 -outform der -in certificate.pem -out certificate.der
—————————————————————————————————–
PEM to P7B
openssl crl2pkcs7 -nocrl -certfile certificate.cer -out certificate.p7b -certfile CAcert.cer
———————————————————————————————————————————-
PEM to PFX
openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CAcert.crt
——————————————————————————————————————————————————
DER to PEM
openssl x509 -inform der -in certificate.cer -out certificate.pem
————————————————————————————————
P7B to PEM
openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
————————————————————————————————-
P7B to PFX
openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
openssl pkcs12 -export -in certificate.cer -inkey privateKey.key -out certificate.pfx -certfile CAcert.cer
——————————————————————————————————————————————————-
PFX to PEM
openssl pkcs12 -in certificate.pfx -out certificate.cer -nodes


openssl 预设输入输出的格式都是PEM, 要转换格式很简单,搭配 inform, outform 参数就可以了


Certificate PEM 转 DER

openssl x509 -inform pem -in cert.pem -outform der -out cert.der


Certificate DER转 PEM

openssl x509 -inform der -in cert.der -outform pem -out cert.pem


RSA key 的转换比较多一些, 有 private/public key, PKCS#1/PKCS#8, DER/PEM, 以下只都是用 PEM 格式, 要转成 DER 只要加入inform, outform 参数就可以了

输出 public key 指令

从 certificate 输出

openssl x509 -in cert.pem -pubkey -noout > public.pem


从 private key 输出

openssl rsa -in private.pem -pubout -out public.pem


PKCS#1/PKCS#8转换
openssl 有多个指令会产生 private key,genpkey会产生PKCS#8格式genrsa会产生PKCS#1格式,
上面兩个输出 public key的指令都是PKCS#8格式

Public key 格式转换,主要是搭配 RSAPublicKey_in,RSAPublicKey_out, 這兩个参数, rsa command的 help沒有显示这两个参数,说明文件才有

Public key: PKCS#8 -> PKCS#1

openssl rsa -pubin -in public.pem -RSAPublicKey_out -out public_pkcs1.pem


Public key: PKCS#1 -> PKCS#8

openssl rsa  -RSAPublicKey_in -in public_pkcs1.pem  -out public_pkcs8.pem


也可以在从 private key 输出時直接设定输出格式

openssl rsa -in private.pem -RSAPublicKey_out -out public_pkcs1.pem


Private key 格式转换,主要是用pkcs8指令,搭配topk8参数作转换,若不加密就再加上nocrypt

Private key: PKCS#1 -> PKCS#8

openssl pkcs8 -in private_pkcs1.pem -topk8 -nocrypt -out private_pkcs8.pem


Private key: PKCS#8 -> PKCS#1

openssl pkcs8 -in private_pkcs8.pem -nocrypt -out private_pkcs1.pem
用OpenSSL 0.9.8可以,之后的版本用pkcs8这个指令输出都是PKCS#8,這指令只是用於0.9.8



用0.9.8之后的版本直接用rsa转换即可
openssl rsa -in private_pkcs8.pem -out private_pkcs1.pem



从PKCS#7 输出 certificate
目前最常遇到的是 DOCSIS secure upgrade 用的 Code File, 前面會有一段 DER 编码的资料, 包含1~2张CVC

openssl pkcs7 -in code.p7b -print_certs -out certs.pem



从 PKCS#12(PFS)输出 certificate 和 private key

openssl pkcs12 -in key_cert.pfx -nodes -out key_cert.pem

打完指令会要求输入 pfx file 的密码,若上述指令没加入nodes,会再要求输入输出的 private key 要用的密碼

把 private key 和 certificate 以及 CA 打包成 PKCS#12
者功能我是用来制作 FreeRADIUS client 端,给 windows 用的懒人包,输入的 private key (client.key), certificate (client.crt), certificate-chain(cert-chain.crt) 都是用 PEM 格式

openssl pkcs12 -export -out client.p12 -inkey client.key -in client.crt -certfile cert-chain.crt

打完指令会要求输入 pfx file 的密码, 之後在 windows下直接开启 client.p12 敲完密码,下一步到底,凭证就会放到对的地方了

 

生成证书命令

证书的生成过程

1. 首先,要生成证书,首先,要有密钥,也就是你用来加密解密的一个RSA密钥对。

2. 制作一个根证书,因为个人使用,不打算找相关机构申请签名,那么你就必须有一个自己的根证书进行签名。

3. 生成一个证书的申请文件,这个文件正常情况下是用来跟机构申请证书的,如果你自己用,就可以用2中的根证书自己签名。

4. 用跟证书给自己的证书签名。

 

x509证书一般会用到三类文件,key,csr,crt。

Key 是私用密钥,openssl格式,通常是rsa算法。

csr是证书请求文件,用于申请证书。在制作csr文件的时候,必须使用自己的私钥来签署申请,还可以设定一个密钥。

crt是CA认证后的证书文件(windows下面的csr,其实是crt),签署人用自己的key给你签署的凭证。

1.    key的生成

openssl genrsa -des3 -out server.key 2048

这样是生成rsa私钥,des3算法,openssl格式,2048位强度。server.key是密钥文件名。为了生成这样的密钥,需要一个至少四位的密码。可以通过以下方法生成没有密码的key:

    openssl rsa -in server.key -out server.key

server.key就是没有密码的版本了。

2. 生成CA的crt

openssl req -new -x509 -key server.key -out ca.crt -days 3650

 生成的ca.crt文件是用来签署下面的server.csr文件。

3.    csr的生成方法:


openssl req -new -key server.key -out server.csr

需要依次输入国家,地区,组织,email。最重要的是,有一个common name,可以写你的名字或者域名。如果为了https申请,这个必须和域名吻合,否则会引发浏览器警报。生成的csr文件交给CA签名后形成服务端自己的证书。

4.    crt生成方法
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -out server.crt

 

在这个blog中讲的更详细一些:https://blog.csdn.net/fyang2007/article/details/6180361

 

posted @ 2018-06-05 18:06  画地自囚  阅读(583)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3