证书标准

X.509 - 这是一种证书标准,主要定义了证书中应该包含哪些内容.其详情可以参考RFC5280,SSL使用的就是这种证书标准.

编码格式

同样的X.509证书,可能有不同的编码格式,目前有以下两种编码格式.

PEM - Privacy Enhanced Mail,打开看文本格式,以"-----BEGIN..."开头, "-----END..."结尾,内容是BASE64编码.
查看PEM格式证书的信息:openssl x509 -in certificate.pem -text -noout
Apache和*NIX服务器偏向于使用这种编码格式.

DER - Distinguished Encoding Rules,打开看是二进制格式,不可读.
查看DER格式证书的信息:openssl x509 -in certificate.der -inform der -text -noout
Java和Windows服务器偏向于使用这种编码格式.

相关的文件扩展名

这是比较误导人的地方,虽然我们已经知道有PEM和DER这两种编码格式,但文件扩展名并不一定就叫"PEM"或者"DER",常见的扩展名除了PEM和DER还有以下这些,它们除了编码格式可能不同之外,内容也有差别,但大多数都能相互转换编码格式.

CRT - CRT应该是certificate的三个字母,其实还是证书的意思,常见于*NIX系统,有可能是PEM编码,也有可能是DER编码,大多数应该是PEM编码,相信你已经知道怎么辨别.

CER - 还是certificate,还是证书,常见于Windows系统,同样的,可能是PEM编码,也可能是DER编码,大多数应该是DER编码.

KEY - 通常用来存放一个公钥或者私钥,并非X.509证书,编码同样的,可能是PEM,也可能是DER.
查看KEY的办法:openssl rsa -in mykey.key -text -noout
如果是DER格式的话,同理应该这样了:openssl rsa -in mykey.key -text -noout -inform der

CSR - Certificate Signing Request,即证书签名请求,这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥(当然还附带了一些别的信息),在生成这个申请的时候,同时也会生成一个私钥,私钥要自己保管好.做过iOS APP的朋友都应该知道是怎么向苹果申请开发者证书的吧.
查看的办法:openssl req -noout -text -in my.csr (如果是DER格式的话照旧加上-inform der,这里不写了)

PFX/P12 - predecessor of PKCS#12,对*nix服务器来说,一般CRT和KEY是分开存放在不同文件中的,但Windows的IIS则将它们存在一个PFX文件中,(因此这个文件包含了证书及私钥)这样会不会不安全?应该不会,PFX通常会有一个"提取密码",你想把里面的东西读取出来的话,它就要求你提供提取密码,PFX使用的时DER编码,如何把PFX转换为PEM编码?
openssl pkcs12 -in for-iis.pfx -out for-iis.pem -nodes
这个时候会提示你输入提取代码. for-iis.pem就是可读的文本.
生成pfx的命令类似这样:openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt
其中CACert.crt是CA(权威证书颁发机构)的根证书,有的话也通过-certfile参数一起带进去.这么看来,PFX其实是个证书密钥库.

JKS - 即Java Key Storage,这是Java的专利,跟OpenSSL关系不大,利用Java的一个叫"keytool"的工具,可以将PFX转为JKS,当然了,keytool也能直接生成JKS,不过在此就不多表了.

证书编码的转换

PEM转为DER openssl x509 -in cert.crt -outform der -out cert.der

DER转为PEM openssl x509 -in cert.crt -inform der -outform pem -out cert.pem

DER转为ARRAY  xxd -i

(提示:要转换KEY文件也类似,只不过把x509换成rsa,要转CSR的话,把x509换成req...)

获得证书

向权威证书颁发机构申请证书

证书请求生成一个csr: 

openssl req -newkey rsa:2048 -new -nodes -keyout private.key -out  cert.csr
把csr交给权威证书颁发机构,权威证书颁发机构对此进行签名,完成.保留好csr,当权威证书颁发机构颁发的证书过期的时候,你还可以用同样的csr来申请新的证书,key保持不变.

或者生成自签名的证书
openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout private.key -out cert.pem

“private.key”/“cert.pem”分别为生成的私钥和证书,那么cert.pem for www.random.com的自签名证书就生成了。
在生成证书的过程中会要你填一堆的东西,其实真正要注意的:

Common Name,通常填写你服务器的域名,如"www.random.com",或者你服务器的IP地址,其它都可以留空的,如果是回环测试要填写为:"localhost",一定要注意,否则调试会报错。
生产环境中还是不要使用自签的证书,否则浏览器会不认,或者如果你是企业应用的话能够强制让用户的浏览器接受你的自签证书也行.向权威机构要证书通常是要钱的,但现在也有免费的,仅仅需要一个简单的域名验证即可.有兴趣的话查查"沃通数字证书".当然通过命令可以查看证书的内容:

openssl x509 -in cert.pem -text -noout
Certificate:
Data:
Version: (0x2)
Serial Number: (0xe7ca8a7bbccb6d5a)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=DE, ST=NRW, L=Earth, O=Random Company, OU=IT, CN=www.random.com/emailAddress=wangshubo1989@.com
Validity
Not Before: Jun :: GMT
Not After : Jun :: GMT
Subject: C=DE, ST=NRW, L=Earth, O=Random Company, OU=IT, CN=www.random.com/emailAddress=wangshubo1989@.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: ( bit)
Modulus:
:ce:ff:c5:ce:a8::5e:eb:::d7:4b:bb:6b:
c9:e1:1a:a3:e1:0d:0e:dd:8d:df:8b:e8:fd:ea::
ba:ba:0b:b4:e1:fe:2b:f5::b4:d1:d3:c5:::
:8d:8e::3b:b7::b6:af:::::::
5b:::::ae::::::a9::::
:::a8::a3:d9:0b:a6:aa:f1::ff::c2:
::fc:e4:0e::dc:c8::2b:3b:e5::::
4d::ce::4c::::f3:cc:d6:e2:e7:4c::
8f:e3::c2::c4:6e::::::da:0a:df:
::b9:da:::a0:e4:3f:b2:fd:da::d6:bc:
5d::cc:c6::::eb::c5:d5:ce:4e:::
d5:3e:b9:3a::::7c:b9:f9:b1:fe:c9:::
6b:2d:f9::d2:cc:e5:be::2c::5d:bf:::
8f::f5:9a:0f:8d:::ed::d5:b8::::
:::::ba::7c:::7d:::a0:cd:
:cd::aa:d3:::ee:4f:0e::ac:f8:7a:bf:
c9:c4:::ff:::cd::1d:6a:1a:9d:ed::
9a:c5
Exponent: (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
A4::A2:E6::A1::5D:FE::2F:5C:D6:ED:D0:1E::E9:C3:E9
X509v3 Authority Key Identifier:
keyid:A4::A2:E6::A1::5D:FE::2F:5C:D6:ED:D0:1E::E9:C3:E9 X509v3 Basic Constraints:
CA:TRUE
Signature Algorithm: sha256WithRSAEncryption
:e2:fe:b3:::4c::3e:d1:db::c5:::a2:7a:2b:
8c:8e::d6:4e:8c::5c:e5:6f:9c:ef:7e:8f::4e::a7:
4d:8f:ee::f3:a2:bc:2d::::1f::a5:::3c::
aa:da::::::7a:5a:ff:::d9:3b:7d:9e:::
3f:fa:bd:b0:d0:8a:f8::bb::::5e:4a:c4:1d:db::
:6b:e6::::f0::6f:::0e::0e::1e:5e::
6a:3f:c0:::a4::::b8:f0::f0:d8:2a::ec::
:::da:f1:::::6b::::c3::9a:9b::
d9::b0:::f4:c5:b9:7d:b1:::ad:c5:ac:9c:f6::
fb:af:::c9:a1::fe:4a:4e::bf:e0:c5:::8f::
:::::1b:::2e:7e:c2:b9:b5:fa::fa:6a:d0:
ff:7b::a5::dd:7c:eb:5b:d1:c5:5a::7f:::1b::
5d:5e:df:a3::::c6:a5:cc::::ae::7a:6d::
8a:6d:0a:0d::5a:::9a:8d:cc:cc:2f:c2::3b:8b:b2:
ff:f5::b3

总结如下:

证书(Certificate) .cer .crt 
私钥(Private Key).key 
证书签名请求(Certificate sign request) .csr 
至于pem和der,是编码方式,以上三类均可以使用这两种编码方式,因此.pem和.der(少见)不一定是以上三种(Cert,Key,CSR)中的某一种

-- 生成 RSA 私钥(传统格式的)

openssl genrsa -out private_key.pem 2048

-- 查看私钥

openssl rsa -noout -text -in private_key.pem

-- 将传统格式的私钥转换成 PKCS#8 格式的(JAVA需要使用的私钥需要经过PKCS#8编码,PHP程序不需要,可以直接略过)

openssl pkcs8 -topk8 -inform PEM -in private_key.pem -outform PEM -nocrypt

-- 使用私钥,生成 RSA 公钥

openssl rsa -in private_key.pem -pubout -out public_key.pem

-- 使用私钥生成自签名证书

openssl req -new -x509 -key private.key -out cert.pem -days  -config openssl.cnf

-- 从证书中提取公钥

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

颁发证书

颁发证书就是用CA的秘钥给其他人签名证书,输入需要证书请求,CA的私钥及CA的证书,输出的是签名好的还给用户的证书

这里用户的证书请求信息填写的国家省份等需要与CA配置一致,否则颁发的证书将会无效。

openssl ca -in ../cert.csr -out cacert.pem -cert ca.pem -keyfile ca.key -config openssl.cnf

对比CA颁发的证书提取公钥和私钥导出的公钥是否一致:

同时产生01.pem,这个是CA的备份保留,与生成发送给请求证书的内容一致,serial内序号自动+1。

通过OpenSSL提供FTP+SSL/TLS认证功能,并实现安全数据传输 http://www.linuxidc.com/Linux/2013-05/84986.htm

Linux下使用OpenSSL生成证书 http://www.linuxidc.com/Linux/2015-05/117034.htm

利用OpenSSL签署多域名证书 http://www.linuxidc.com/Linux/2014-10/108222.htm

OpenSSL生成公钥私钥***的更多相关文章

  1. Java中使用OpenSSL生成公钥私钥进行数据加解密

    当前使用的是Linux系统,已经安装OpenSSL软件包. 一.使用OpenSSL来生成私钥和公钥1.执行命令openssl version -a 验证机器上已经安装openssl $ openssl ...

  2. openssl生成公钥私钥对 加解密

    在计算机软件开发世界中,编程语言种类极多,数据在各种语言的表现形式可能有所差异,但数据本身的处理可能,或者说本质上是完全一样的:比如数据在某个算法中的运算过程是一样的.在这里,我以加密与解密来作为例子 ...

  3. PHP Openssl 生成公钥私钥

    <?php //配置信息 $dn = array( "countryName" => "GB", "stateOrProvinceName ...

  4. 用 openSSL 生成 公钥 私钥

    支付宝app接口需要 RSA加密通讯 https://doc.open.alipay.com/doc2/detail?treeId=58&articleId=103242&docTyp ...

  5. .net core中使用openssl的公钥私钥进行加解密

    这篇博文分享的是 C#中使用OpenSSL的公钥加密/私钥解密 一文中的解决方法在 .net core 中的改进.之前的博文针对的是 .NET Framework ,加解密用的是 RSACryptoS ...

  6. MAC生成公钥私钥

    前言 需要开发者在本地上使用openssl来生成私钥和公钥 由于mac 自带openssl工具,所以不用像windows那样要下载安装openssl工具 步骤 1.创建一个文件夹,终端进入该文件夹 c ...

  7. Windows下生成 公钥 私钥以及 配置 Filezilla中的 SFTP的私钥

    Win下需要使用到 PuTTYgen.exe来生成公钥私钥,可以参考youtube的这篇文章:  为 SFTP 保管箱生成 Secure Shell (SSH) 密钥对 PuTTYgen.exe的下载 ...

  8. MAC下用OPENSSL生成公钥和私钥

    MAC OS自带了OpenSSL,所以不用去编译那一坨跟SHIT一样的源码.直接在命令行里使用OPENSSL就可以. 打开命令行工具,然后输入 openssl打开openssl,接着只要三句命令就可以 ...

  9. windows 下 openssl 生成RSA私钥公钥以及PKCS8

    生成RSA私钥 打开bin文件夹下面的openssl.exe,输入genrsa -out rsa_private_key.pem 1024 把RSA私钥转换成PKCS8格式 输入命令pkcs8 -to ...

随机推荐

  1. QuerySetAPI笔记

    学习Django时做的笔记MarkDown文件点这里 # 模型.objects:这个对象是`django.db.models.manager.Manager`的对象,这个类是一个空壳类,他上面的所有方 ...

  2. List根据某个字段(属性)去重

    有时候自带的list.Distinct()去重并不能满足魔门的要求,比如以下情况 如果testList的Name相同则视为重复,则可以如下实现,比写循环语句简洁多了 testList.Where((x ...

  3. 2: 使用Prism初始化程序 Initializing Applications Using the Prism Library 5.0 for WPF(英汉对照版)

    This topic addresses what needs to happen to get a Prism for WPF application up and running. A Prism ...

  4. hdu4309

    题解: 暴力枚举 然后网络流 代码: #include<iostream> #include<cstdio> #include<cstring> using nam ...

  5. poj 1182 食物链(高级的带权并查集)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 76486   Accepted: 22742 Description ...

  6. PIVOT 和 UNPIVOT 命令的SQL Server版本

    I:使用 PIVOT 和 UNPIVOT 命令的SQL Server版本要求 1.数据库的最低版本要求为 SQL Server 2005 或 更高 2.必须将数据库的兼容级别设置为 90 或 更高 3 ...

  7. 解决方案:System.InvalidOperationException: 此实现不是 Windows 平台 FIPS 验证的加密算法的一部分。

    System.InvalidOperationException: This implementation is not part of the Windows Platform FIPS valid ...

  8. Netlink 基础知识

    Netlink 基础知识 Netlink 相对于系统调用,ioctl 以及 /proc 文件系统而言具有以下优点: 1. 用户仅需要在 include/linux/netlink.h 中增加一个新类型 ...

  9. L147 Low Cost Study Has High Impact Results For Premature Babies

    No one knows exactly why some babies are born prematurely(早产), but some of the smallest premature ba ...

  10. cookies分类

    Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie. 内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的.硬盘Cooki ...