私钥和证书的创建方法

news/2024/7/3 0:57:06
方法一:(http://blog.csdn.net/fenglibing/article/details/8610280)
1、使用OpenSSL生成私钥
  常用的生成算法有RSA及DSA,RSA生成的私钥可以用来加密以及签名,而DSA生成的私钥只可以用来签名
  1.1)、RSA算法生成key的示例
  openssl genrsa -des3 -out privkey.pem 2048
 
   genrsa:指定了生成了算法使用RSA
   -desc:表示生成的key是有密码保护的(注:如果是将生成的key与server的证书一起使用,最好不需要密码,就是不要这个参数,否则其它人就会在请求的时候每次都要求输入密码)
   -out:后面的参数表示生成的key的输入文件
   2048:表示的是生成key的大小,单为字节(bits)


  1.2)、DSA算法生成key的示例
    根据DSA算法生成Key需要两步:
    1.2.1)、第一步是生成用于生成Key的参数:
         openssl dsaparam -out dsaparam.pem 2048
    1.2.2)、根据生成的参数生成Key:
         openssl gendsa -des3 -out privkey.pem dsaparam.pem


    详细参见:http://www.openssl.org/docs/HOWTO/keys.txt




2、使用OpenSSL创建证书申请及自签名证书
  在第1步中,我们已经创建好了私钥,这个时候我们就可以使用创建好的private.pem来创建证书申请及自签名证书。


   2.1) 创建证书申请
   openssl req -new -key privkey.pem -out cert.csr
     使用上面的命令就会创建一个证书申请,这里我们会要求输入国家、组织、姓名等信息,但是不会要求输入证书有效天数,因为证书有效天数是CA认证中心给我们的;然后我们会把这个生成好的cert.csr(Certificate Signing Request (CSR):证书签名申请)发给CA认证中心。
     CA认证中心通过后,会反馈(通常是邮件)回来认证的信息,再导入即可。
     关于导出CSR以及导入CA认证信息,可以参看文档:http://docs.oracle.com/javase/1.4.2/docs/tooldocs/windows/keytool.html


   2.2) 创建自签名的证书
    openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095
    如果不需要第三方授权,或者是要创建一个用于测试的授权,我们就可以这样操作。后面的参数"-days 1095"表示授权天数为1095天。




方法二:(http://blog.csdn.net/baixiaoshi/article/details/41686655)
1.首先要生成服务器端的私钥(key文件):
openssl genrsa -des3 -out server.key 1024
运行时会提示输入密码,此密码用于加密key文件(参数des3便是指加密算法,当然也可以选用其他你认为安全的算法.),以后每当需读取此文件(通过openssl提供的命令或API)都需输入口令.如果觉得不方便,也可以去除这个口令,但一定要采取其他的保护措施!
去除key文件口令的命令:
openssl rsa -in server.key -out server.key


2.openssl req -new -key server.key -out server.csr -config openssl.cnf
生成Certificate Signing Request(CSR),生成的csr文件交给CA签名后形成服务端自己的证书.屏幕上将有提示,依照其指示一步一步输入要求的个人信息即可.


3.对客户端也作同样的命令生成key及csr文件:
openssl genrsa -des3 -out client.key 1024
openssl req -new -key client.key -out client.csr -config openssl.cnf


4.CSR文件必须有CA的签名才可形成证书.可将此文件发送到verisign等地方由它验证,要交一大笔钱,何不自己做CA呢.
openssl req -new -x509 -keyout ca.key -out ca.crt -config openssl.cnf


5.用生成的CA的证书为刚才生成的server.csr,client.csr文件签名:
Openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
Openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -config openssl.cnf


现在我们所需的全部文件便生成了.


另:
client使用的文件有:ca.crt,client.crt,client.key
server使用的文件有:ca.crt,server.crt,server.key
.crt文件和.key可以合到一个文件里面,本人把2个文件合成了一个.pem文件(直接拷贝过去就行了)




用openssl生成SSL使用的私钥和证书,并自己做CA签名
来源:本站转载 作者:佚名 时间:2013-12-02 TAG: 我要投稿


 本文记叙的是一次基于SSL的socket通讯程序开发中,有关证书,签名,身份验证相关的步骤。 我们的场景下,socket服务端是java语言编写的,客户端是c语言。使用了一个叫做matrixssl的c语言库。自己做CA签名,不等同于“自签名”。 自签名的情况,RSA的公钥私钥只有一对,用私钥对公钥证书做签名。而我们的场景是,自己做CA,有一个CA的公钥私钥对。 而socket的服务端也有一个公钥私钥对。 用CA的私钥对socket服务端的公钥证书做签名。
openssl genrsa -out ca.key 1024
(这里我们没有用des3加密。 可以增加一个-des3参数加密,详情可以man genrsa) 
openssl req -new -x509 -days 36500 -key ca.key -out ca.crt
(这一步的时候需要在提示之下输入许多信息,包括国家代码,省份,城市,公司机构名等) 
生成server端的私钥key:
openssl genrsa -out server.key 1024
生成server端的req文件(这一步生成的req文件,包含公钥证书,外加身份信息,例如国家,省份,公司等。用它提交给ca,让ca来对它做签名 ):
openssl req -new -key server.key -out server.csr
用CA的私钥对server的req文件做签名,得到server的证书: 


openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt


(注:如果第一次使用openssl,报告一些相关的文件找不到之类的错误,可能需要先执行2个命令:touch /etc/pki/CA/index.txt 和 echo '01' > /etc/pki/CA/serial) 
以上得到的server.crt就是服务端的证书文件。(有很多软件中需要各种不同证书存储格式,可能需要各种转换。 如PEM, P12等,我们的场景下也需要一点转换,下文会描述。刚开始做这些的同学可能会觉得证书,以及格式等非常的混乱。 这个时候能做的就是冷静下来,耐心的理清楚TLS, RSA等原理, 多看看openssl的man文档) 
不知道把ca.crt叫做CA的证书文件是否妥当,但是可以确定的是,客户端使用ca.crt可以校验server的身份。server在SSL/TLS握手的过程中会下发自己的证书,而这个证书是经过CA签名的。CA签名的时候使用的是CA自己的私钥,而ca.crt则包含了CA的公钥,可以用于检验这一签名,以确认是否是自己签的名。
服务端需要使用的文件是:server私钥(key), server证书。 
客户端需要使用的文件是:CA file(ca的证书,用以验证server下发的证书)
我们的server端使用java, 使用p12(PKCS12)格式的证书。使用openssl可以进行格式转换: 
openssl pkcs12 -export -clcerts -in server.crt -inkey server.key -out server.p12
可以看到输出的server.p12中应该包含了server.key和server.crt的内容。
我们的c语言客户端直接使用CA文件: ca.crt.
我们也用java写过客户端, java使用CA文件格式为 jks。那么可能需要一个转换,这里使用的是java的bin目录下的keytool: 
keytool -importcert -alias CA -file ca.crt -keystore ca.jks
转换的时候要求输入一个密码。这样就把ca.crt转换为了 ca.jks格式。
下面附上部分socket服务端和java版的客户端的代码。c的就不贴了,用的matrixssl。
java服务端(mina)代码片段:
String file = "/file/path/server.p12";
        String keyType = "PKCS12"; char[] password = "passwd".toCharArray();
        KeyStore ks = KeyStore.getInstance(keyType);
        ks.load(new FileInputStream(file), password);
        KeyManagerFactory kmf = KeyManagerFactory.getInstance(
            KeyManagerFactory.getDefaultAlgorithm());
        kmf.init(ks, password);
        SSLContext ctx = SSLContext.getInstance("TLS");
        ctx.init(kmf.getKeyManagers(), null, null);


        SslFilter sslFilter = new SslFilter(ctx); // 在mina的acceptor中增加这个filter就可以了。 
acceptor.getFilterChain().addLast("ssl", new SslFilter(createSslContext()));

http://www.niftyadmin.cn/n/4598706.html

相关文章

WebRTC56版本SDP详细解析

http://blog.csdn.net/onlycoder_net/article/details/76702432v0//sdp版本号&#xff0c;一直为0,rfc4566规定o- 7017624586836067756 2 IN IP4 127.0.0.1// RFC 4566 o<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-…

KCP传输原理

来自&#xff1a;https://wetest.qq.com/lab/view/391.html?fromcoop_gad 1 简介 KCP是一个快速可靠协议&#xff0c;能以比 TCP浪费10%-20%的带宽的代价&#xff0c;换取平均延迟降低 30%-40%&#xff0c;且最大延迟降低三倍的传输效果。纯算法实现&#xff0c;并不负责底层…

H264 Annex B 与 AVCC的区别

本文链接&#xff1a;https://blog.csdn.net/Romantic_Energy/article/details/50508332 首先要理解的是没有标准的H.264基本流格式。文档中的确包含了一个Annex&#xff0c;特别是描述了一种可能的格式Annex B格式&#xff0c;但是这个并不是一个必须要求的格式。标准文档中指…

CSS左中右布局,规范案例

html部分 <body> <form id"form1" runat"server"> <div id"wrap"> <div id"header">header</div> <div id"container"> <div id"left_side">left_side</div&g…

ffmpeg监听和接收rtp音视频流

在网上找了一圈关于ffmpeg如何接收rtp流的Example&#xff0c;都是使用ffmpeg 命令行来实现的&#xff0c;还没看到用相关ffmpeg库和API来实现的&#xff0c;于是自己写了个小程序&#xff0c;来验证ffmpeg在本地监听rtp流&#xff0c;代码在ffmpeg4.1win10环境下测试可行&…

windows下使用camera(opencv方式)

一. opencv支持读取摄像头&#xff0c;支持视频录制或显示&#xff0c; 具体代码 //1. 初始化视频录制文件 String recFileName std::to_string(count) "_rec.avi"; int wfourcc VideoWriter::fourcc(M, J, P, G); writer VideoWriter(recFileName,…

JS TypeError:*is undefined

JS在解析JSON数据时&#xff0c;操作生疏可能犯的错误。 success:function(data){ if(data "failure"){ alert("请求出错,请刷新页面再操作"); } var res eval(data); var msgList res[0].msgList; var pgInfo res[0].pageInfo; var page ""…

windows下使用camera (ffmpeg dshow方式)

方法概要&#xff1a;先读取camera支持的mode&#xff0c;然后用ffmpeg dshow打开camera并解码压缩流 一. 用相关代码读取本地camera当前支持的输出mode&#xff0c;方便后续选择mode来打开camera&#xff1a; bool EnumerateCameras(vector<int>& camIdx) { …