转自:https://www.zybuluo.com/muyanfeixiang/note/392079

简介

公钥私钥用来互相加解密的一对密钥,一般是采用RSA非对称算法。公钥加密的私钥能解密,私钥加密的公钥能解密。关于公私钥更多内容,网上都有就不详细介绍。

关于CA证书,是由第三方机构下发的,可以对私钥签名附加上机构信息。浏览器就可以在https协议中通过该证书信任第三分站点。当然也可以自己生成根证书来签发子证书。

 

操作

 

生成根证书

1.首先生成私钥

 
  1. openssl genrsa -out root.key 2048

该命含义如下: 
genrsa——使用RSA算法产生私钥 
-aes256——使用256位密钥的AES算法对私钥进行加密(以忽略) 
-out——输出文件的路径 
2048——指定私钥长度 
2.生成根证书签发申请文件(csr文件)

 
  1. openssl req -new -key root.key -out root.csr -subj "/C=CN/ST=ShangHai/L=ShangHai/O=Yunan International Trust Company/OU=Internet Finance/CN=YNTRUST"

该命令含义如下: 
req——执行证书签发命令 
-new——新证书签发请求 
-key——指定私钥路径 
-out——输出的csr文件的路径 
-subj——证书相关的用户信息(subject的缩写) 
3.自签发根证书(cer文件)

 
  1. openssl x509 -req -days 3000 -sha1 -extensions v3_ca -signkey root.key -in root.csr -out root.cer

该命令的含义如下: 
x509——生成x509格式证书 
-req——输入csr文件 
-days——证书的有效期(天) 
-sha1——证书摘要采用sha1算法 
-extensions——按照openssl.cnf文件中配置的v3_ca项添加扩展 
-signkey——签发证书的私钥 
-in——要输入的csr文件 
-out——输出的cer证书文件 
使用的-extensions值为v3_ca,v3_ca中指定的basicConstraints的值为CA:TRUE,表示该证书是颁发给CA机构的证书。

到此就完成了根证书的生成。

 

使用根证书签发服务端证书

和生成根证书的步骤类似,这里就不再介绍相同的参数了。 
1.生成服务端私钥(可以给商户客户)

 
  1. openssl genrsa -out private/server-key.pem 2048

2.生成证书请求文件

 
  1. openssl req -new -key private/server-key.pem -out private/server.csr -subj "/C=CN/ST=ShangHai/L=ShangHai/O=Yunan International Trust Company/OU=Internet Finance/CN=YNTRUST"

3.使用根证书签发服务端证书(此时证书只有公钥,没有私钥)

 
  1. openssl x509 -req -days 3000 -sha1 -extensions v3_req -CA root_cert/root.cer -CAkey root_cert/root.key -CAserial ca.srl -CAcreateserial -in private/server.csr -out private/server.cer

这里有必要解释一下这几个参数: 
-CA——指定CA证书的路径 
-CAkey——指定CA证书的私钥路径 
-CAserial——指定证书序列号文件的路径 
-CAcreateserial——表示创建证书序列号文件(即上方提到的serial文件),创建的序列号文件默认名称为-CA,指定的证书名称后加上.srl后缀 
注意:这里指定的-extensions的值为v3_req,在OpenSSL的配置中,v3_req配置的basicConstraints的值为CA:FALSE 
4.将上一步的证书转换为der格式(二进制格式,不能文本打开)

 
  1. openssl x509 -outform der -in test-private/server.cer -out private/publicserver.ccertificate.der
 

证书格式的转换

以上生成的公私钥和证书都是PEM格式的,但很多时候不同场景中还需要用到其他格式的证书:

 
  1. p12/pfx

p12/pfx是按照PKCS#12编码的对象,它通常由X.509证书和对应的私钥组成。生成p12格式的方法如下:

 
  1. openssl pkcs12 -export -in server.cer -inkey server-key.pem -out server.pfx

由于文件中保存了私钥,因此执行该命令,openssl会要求用户输入密码,用于保护私钥。

 

从私钥导出公钥

 
  1. openssl rsa -in server-key.pem -pubout -outform PEM -out server-key-pub.pem
 

c#操作签名和验证

 
  1. X509Certificate2 pri = new X509Certificate2(@"D:\self_cerf\certs\000191400205798.pfx", "123456"); //读取签名私钥
  2. var testData = Encoding.UTF8.GetBytes("liuyanbin");
  3. RSACryptoServiceProvider rsaObj = null;
  4. if (pri.HasPrivateKey)
  5. {
  6. rsaObj = (RSACryptoServiceProvider)pri.PrivateKey;
  7. var signature = rsaObj.SignData(testData, new SHA1CryptoServiceProvider());//使用SHA1算法获得摘要并进行签名
  8. //var pri_pub = (RSACryptoServiceProvider)pri.PublicKey.Key;
  9. //var ss = rsaObj.VerifyData(testData, new SHA1CryptoServiceProvider(), signature);
  10. var rsa = PemKeyUtils.GetRSAProviderFromPemFile(@"D:\self_cerf\private\server-key-pub.pem");//获取公钥
  11. var result = rsa.VerifyData(testData, new SHA1CryptoServiceProvider(), signature);//验证签名
  12. }

PemKeyUtils代码详见公钥相关代码

-------------------  update @ 20170515  -----------------------------------

生成带密码的私钥(请注意:这个方法是错误的!!!):

/home/tong/Keys/https/test [tong@T7] [:]
> openssl genrsa -out server-withpass.pem -passout pass:one1234
Generating RSA private key, bit long modulus
....................+++
..+++
e is (0x010001)

密码参数的格式: man 1 openssl

  -------------  4 hours later  ------------

发现各种诡异问题,始终感觉加密没有成功。。。。。 原来。。。。 真的没有成功。。。尼玛。。。请看 man genrsa 的这一段:

       -aes128|-aes192|-aes256|-camellia128|-camellia192|-camellia256|-des|-des3|-idea
These options encrypt the private key with specified cipher before outputting it. If none of these options is specified no encryption is used. If
encryption is used a pass phrase is prompted for if it is not supplied via the -passout argument.

于是,重新修改上边的命令:

/home/tong/Keys/https/test [tong@T7] [:]
> openssl genrsa -out server-withpass.pem -des3 -passout pass:one1234
Generating RSA private key, bit long modulus
..+++
.........+++
e is (0x010001)

怎么验证有没有加密呢?加密成没成功?

1. 导出一下公钥,如果有加密,一定会和你要密码的

/home/tong/Keys/https/test [tong@T7] [:]
> openssl rsa -in server-withpass.pem -pubout
Enter pass phrase for server-withpass.pem:

2.  cat 一下,就可以看出来了。加了密的和没加密的内容不同

/home/tong/Keys/https/test [tong@T7] [:]
> cat server-withpass.pem
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: ,ENCRYPTED
DEK-Info: DES-EDE3-CBC,83CB22577C5385B6 fwFmtRTl8tZhL7MLOQk0LwaL5IFZWel0x
...... ......
69hch0TG+LsnMdNTkbQtwbBIaZGvafwL2ir7VNxHjM1N0Nw
-----END RSA PRIVATE KEY----- /home/tong/Keys/https/test [tong@T7] [:]
> cat server-key.pem
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAxImkuzjwDrtKkvGN78/s
...... ......
a55nnYhvTpDqsLZtRFitPTP27q9LDns=
-----END RSA PRIVATE KEY-----

更对内容:

[ipsec][strongswan] 用strongswan pki工具生成自签名证书

[ipsec][crypto] 有点不同的数字证书到底是什么

[https][openssl] OpenSSL 公钥、私钥以及自签名证书的更多相关文章

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

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

  2. OpenSSL生成公钥私钥***

    证书标准 X.509 - 这是一种证书标准,主要定义了证书中应该包含哪些内容.其详情可以参考RFC5280,SSL使用的就是这种证书标准. 编码格式 同样的X.509证书,可能有不同的编码格式,目前有 ...

  3. OpenSSL与公钥私钥证书签名的千丝万缕

    导语 人对任何事物的认识都是阶段性的,从无知到知晓,从懵懂到半知半解,从误解到将信将疑,从晕头转向到下定决心吃透. 介绍 OpenSSL是一个强大的命令行工具,它可以用来处理许多种跟PKI(Publi ...

  4. 支付宝开放平台 配置RSA(SHA1)密钥 OpenSSL配置公钥私钥对

    进入到第一次配置支付宝支付服务了 配置支付宝服务,需要去支付宝的开放平台申请服务 需要设置一些参数 其中需要在后台设置配置RSA(SHA1)密钥(公钥(注意这个子读"yao")) ...

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

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

  6. C# 中使用 OpenSSL 的公钥/私钥进行加密和解密

    在C#中进行RSA解密,需要用RSACryptoServiceProvider,但是不支持OpenSSL格式的公钥或者私钥. X509 公钥 -----BEGIN PUBLIC KEY----- MI ...

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

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

  8. 用 openSSL 生成 公钥 私钥

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

  9. PHP Openssl 生成公钥私钥

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

随机推荐

  1. .NET开发微信公众号之创建自定义菜单

    一.简介 微信公众平台服务号以及之前成功申请内测资格的订阅号都具有自定义菜单的功能.开发者可利用该功能为公众账号的会话界面底部增加自定义菜单,用户点击菜单中的选项,可以调出相应的回复信息或网页链接.自 ...

  2. VS2013 未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService

    全是2012版本的  没找到2013的! 控制面板>程序>程序和功能 找到如下选中软件右击修复 即可 需关闭VS2013 参考:https://blog.csdn.net/zhaoyun9 ...

  3. 【九天教您南方cass 9.1】 10 DTM土方计算的四种方法

    同学们大家好,欢迎收看由老王测量上班记出品的cass9.1视频课程 我是本节课主讲老师九天. 我们讲课的教程附件也是共享的,请注意索取测量空间中. [点击索取cass教程]5元立得 (给客服说暗号:“ ...

  4. not in 的优化

    //---------------------- 建表1 ---------------------- create table TESTTABLE( id1 VARCHAR2(12), name V ...

  5. Java知多少(45)未被捕获的异常

    在你学习在程序中处理异常之前,看一看如果你不处理它们会有什么情况发生是很有好处的.下面的小程序包括一个故意导致被零除错误的表达式. class Exc0 { public static void ma ...

  6. CSS3 Flexbox可视化指南

    0. 目录 目录 引言 正文 1 引入 2 基础 3 使用 4 弹性容器Flex container属性 41 flex-direction 42 flex-wrap 43 flex-flow 44 ...

  7. 【转】WPF自定义控件与样式(7)-列表控件DataGrid与ListView自定义样式

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等. 本文主要内容: DataGrid自定义样式: ListView自定义样式: 二.Dat ...

  8. 【Window 7】解决Win7远程桌面无法全屏的方法

    在Windows中有一项远程桌面功能,可以登录到其他电脑上进行远程控制,就像操纵本机一样,非常方便.但是最近发现用远程桌面登录过去时并不是全屏模式,而是窗口模式,老要拉滚动条,实在很不方便,今天还是到 ...

  9. [React] 12 - Redux: async & middleware

    Ref: Redux 入门教程(二):中间件与异步操作 这里只是简单地了解中间件的概念,对于异步,貌似之后要讲的saga更胜一筹. reducer计算新状态的策略: Action 发出以后,Reduc ...

  10. ElasticSearch(一)-- 简介

    ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apach ...