什么是证书

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, 要转换格式很简单,搭配 informoutform 参数就可以了

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 只要加入informoutform 参数就可以了

输出 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

x509证书相关内容的更多相关文章

  1. ios开发者账号、证书相关内容

    背景:因为在实际测试中会涉及到不同的证书,而自己又对证书不了解,所以去查资料了解了一下不同证书的区别,如果有不对的地方,欢迎指正补充.   In House:所有手机都可以安装,但是不能上传到app ...

  2. CSP:使用CryptoAPI解码X509证书内容

    微软的CryptoAPI提供了一套解码X509证书的函数,一个X509证书解码之后,得到一个PCCERT_CONTEXT类型的结构体指针. 通过该结构体,我们就能够获取想要的证书项和属性等. X509 ...

  3. 那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)

    之前没接触过证书加密的话,对证书相关的这些概念真是感觉挺棘手的,因为一下子来了一大堆新名词,看起来像是另一个领域的东西,而不是我们所熟悉的编程领域的那些东西,起码我个人感觉如此,且很长时间都没怎么搞懂 ...

  4. 那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)[zz]

    openssl dgst –sign privatekey.pem –sha1 –keyform PEM –c c:\server.pem 将文件用sha1摘要,并用privatekey.pem中的私 ...

  5. 通过OpenSSL解码X509证书文件

    在Windows平台下.假设要解析一个X509证书文件,最直接的办法是使用微软的CryptoAPI. 可是在非Windows平台下,就仅仅能使用强大的开源跨平台库OpenSSL了.一个X509证书通过 ...

  6. MQTT研究之EMQ:【JAVA代码构建X509证书】

    这篇帖子,不会过多解释X509证书的基础理论知识,也不会介绍太多SSL/TLS的基本信息,重点介绍如何用java实现SSL协议需要的X509规范的证书. 之前的博文,介绍过用openssl创建证书,并 ...

  7. 那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)(使用OpenSSL的命令行)

    之前没接触过证书加密的话,对证书相关的这些概念真是感觉挺棘手的,因为一下子来了一大堆新名词,看起来像是另一个领域的东西,而不是我们所熟悉的编程领域的那些东西,起码我个人感觉如此,且很长时间都没怎么搞懂 ...

  8. openssl rsa加密,解密以及X509证书的使用

    Openssl的相关使用 生成证书 生成证书见:使用 openssl 生成证书 代码实现 Cert.h #ifndef _CERT_H #define _CERT_H ///header files ...

  9. OpenSSL 使用拾遗(二)---- X509 证书的 SKID/AKID 字段

    SKID(证书使用者密钥标识符,subject key identifier 的简称)和 AKID(证书颁发机构密钥标识符,authority key identifier 的简称)是 X509 证书 ...

随机推荐

  1. Fragment概述

    1 Fragment Fragment是什么? Fragment允许将Activity拆分成多个完全独立封装的可重用的组件,每个组件有它自己的生命周期和UI布局. 每个Fragment都是独立的模块, ...

  2. DWM1000 测距原理简单分析 之 SS-TWR代码分析2 -- [蓝点无限]

    蓝点DWM1000 模块已经打样测试完毕,有兴趣的可以申请购买了,更多信息参见 蓝点论坛 正文: 首先将SS 原理介绍中的图片拿过来,将图片印在脑海里. 对于DeviceA 和 DeviceB来说,初 ...

  3. css 基本语法及页面引用:

    css基本语法: css的定义方法是: 选择器{ 属性:值; 属性:值; 属性:值; } 选择器是将样式和页面元素关联起来的名称,属性是希望设置的样式属性,每个属性有一个或多个值. 如: div{ w ...

  4. vue-cli模拟后台数据交互

    作为一个前端入坑的妹子,在学习vue的道路上挣扎徘徊,由一开始的对vue一直蒙圈只知道双向数据绑定和一些'V-x'的指令,慢慢通过一个视频的学习渐渐入坑,对于我这个js基础不怎么好而且编程思维又不是很 ...

  5. centos7.4中安装docker

    #!/bin/sh # 安装docker # 在docker中安装mysql # 解决了docker容器中无法输入中文的问题 ##########################安装docker # ...

  6. 使用Object.prototype.toString.call()方法精确判断对象的类型

    在JavaScript里使用typeof判断数据类型,只能区分基本类型,即:number.string.undefined.boolean.object. 对于null.array.function. ...

  7. Bypass 360主机卫士SQL注入防御(附tamper脚本)

    0x01 前言 在测试过程中,经常会遇到一些主机防护软件,对这方面做了一些尝试,可成功bypass了GET和POST的注入防御,分享一下姿势. 0x02 环境搭建 Windows Server 200 ...

  8. SOAPwebservice 与Restfull webservice之间的区别

    简单对象访问协议(Simple Object Access Protocol,SOAP)是一种基于 XML 的协议,可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP),简单邮件传 ...

  9. 20175320 2018-2019-2 《Java程序设计》第9周学习总结

    20175320 2018-2019-2 <Java程序设计>第9周学习总结 教材学习内容总结 本周学习了教材的第十一章的内容,在这章中介绍了JDBC与Mysql数据库,通过本章我了解到了 ...

  10. Easyui datagrid 数据表格 表格列头右键菜单选择展示列 JS

    Easyui ,数据表格加载出来以后,在表格头右键,会有显示筛选的功能: 如图: 然后可以取消勾选,就变成下面这个样子: 功能的实现是通过重写了easyui 的 $.fn.datagrid.defau ...