用openssl生成SSL使用的私钥和证书,并自己做CA签名(转)
本 文记叙的是一次基于SSL的socket通讯程序开发中,有关证书,签名,身份验证相关的步骤。 我们的场景下,socket服务端是java语言编写的,客户端是c语言。使用了一个叫做matrixssl的c语言库。自己做CA签名,不等同于“自签 名”。 自签名的情况,RSA的公钥私钥只有一对,用私钥对公钥证书做签名。而我们的场景是,自己做CA,有一个CA的公钥私钥对。 而socket的服务端也有一个公钥私钥对。 用CA的私钥对socket服务端的公钥证书做签名。
openssl genrsa -out ca.key
(这里我们没有用des3加密。 可以增加一个-des3参数加密,详情可以man genrsa)
openssl req -new -x509 -days -key ca.key -out ca.crt
(这一步的时候需要在提示之下输入许多信息,包括国家代码,省份,城市,公司机构名等)
生成server端的私钥key:
openssl genrsa -out server.key
生成server端的req文件(这一步生成的req文件,包含公钥证书,外加身份信息,例如国家,省份,公司等。用它提交给ca,让ca来对它做签名 ):
openssl req -new -key server.key -out server.csr
用CA的私钥对server的req文件做签名,得到server的证书:
openssl x509 -req -days -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()));
java版客户端(mina)代码片段:
// trust String file = "/data/tmp/ca.jks";
String keyType = "jks"; char[] password = "123456".toCharArray();
KeyStore ks = KeyStore.getInstance(keyType);
ks.load(new FileInputStream(file), password);
TrustManagerFactory tmf = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks); SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);
SslFilter sslFilter = new SslFilter(sslContext);
sslFilter.setUseClientMode(true); // server端是addLast , 这个却是 addFirst. 这个顺序不能搞错了。
connector.getFilterChain().addFirst("sslFilter", sslFilter);
用openssl生成SSL使用的私钥和证书,并自己做CA签名(转)的更多相关文章
- openssl生成ssl证书
openssl生成ssl证书 x509证书一般会用到三类文,key,csr,crt. Key 是私用密钥openssl格,通常是rsa算法. Csr 是证书请求文件,用于申请证书.在制作csr文件的时 ...
- OPENSSL生成SSL自签证书
OPENSSL生成SSL自签证书 目前,有许多重要的公网可以访问的网站系统(如网银系统)都在使用自签SSL证书,即自建PKI系统颁发的SSL证书,而不是部署支持浏览器的SSL证书. 支持浏览器的SSL ...
- 使用openssl生成SSL证书完全参考手册
一般来说,配置HTTPS/SSL的步骤为: 1.生成足够强度的私钥.需要考虑:算法,广泛采用的一般是RSA.键长度,RSA默认为512,一般应选择2048.密码,虽然私钥不一定要加密存储,但是加密存储 ...
- Windows 下使用OpenSSL生成RSA公钥和私钥
Windows 下使用OpenSSL生成RSA公钥和私钥 (1)下载OpenSSL 可到该地址下载OpenSSL: https://www.openssl.org/source/(https://ww ...
- openssl生成SSL证书的流程
SSL证书通过在客户端浏览器和Web服务器之间建立一条SSL安全通道(Secure socketlayer(SSL),SSL安全协议主要用来提供对用户和服务器的认证:对传送的数据进行加密和隐藏:确保数 ...
- openssl生成ssl证书(转)
原文:http://blog.sina.com.cn/s/blog_4fd50c390101891c.html x509证书一般会用到三类文,key,csr,crt. Key 是私用密钥openssl ...
- Java中使用OpenSSL生成的RSA公私钥
RSA是什么:RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有影响力的 ...
- openssl生成SSL证书的流程 - moonhillcity的博客 - CSDN博客
1.安装openssl 之后在/usr/lib/ssl目录下(ubuntu系统,用whereis查下ssl目录即可)下找到openssl.cnf,拷贝到工作目录下. 2.工作目录下新建demoCA文件 ...
- 如何使用openssl生成RSA公钥和私钥对
在ubuntu上要使用openssl的话需要先进行安装,命令如下: sudo apt-get install openssl 安装完成就可以使用openssl了. 首先需要进入openssl的交互 ...
随机推荐
- C#程序集系列07,篡改程序集
以下几个方面用来区分不同的程序集:○ 程序集名称:Name○ 程序集版本:Version○ 程序集公匙: Public Token○ 程序集文化:Culture 如果没有很严格地按照上面的几个方面来创 ...
- MVC无限级分类02,增删改查
继上一篇"MVC无限级分类01,分层架构,引入缓存,完成领域模型与视图模型的映射",本篇开始MVC无限级分类的增删改查部分,源码在github. 显示和查询 使用datagrid显 ...
- 报错:不允许保存更改。您所做的更改要求删除并重新创建以下表……
在使用SQL Server 2008为某个表添加列的时候出现启用了"阻止保存要求重新创建表的更改问题的设置方法..."报错: 解决方法: 工具--选项--Designers-- ...
- 图片碎片化mask动画
图片碎片化mask动画 效果 源码 https://github.com/YouXianMing/Animations // // TransformFadeViewController.m // A ...
- Android之从Browser中打开本地的应用程序&微信检测是否有对应app
在对应的应用程序的AndroidManifest.xml中配置: <activity android:name=".ui.TabHostActivity" android:w ...
- mysql错误日志/var/log/mariadb/mariadb.log,二进制日志
mariadb-日志 IT_luo关注0人评论65人阅读2018-10-15 08:59:03 mariadb日志 mariadb日志: 1.查询日志:query log: 2.慢查询日志:slo ...
- 简明python教程 --C++程序员的视角(三):模块
模块和包 1 python程序由包(package).模块(module)和函数组成.包是由一系列模块组成的集合.模块是处理某一类问题的函数和类的集合.函数是一段可以重复多次调用的代码. 2 pyth ...
- ldap服务器OpenLDAP安装使用
OpenLDAP 是 LDAP 协议的一个开源实现.LDAP 服务器本质上是一个为只读访问而优化的非关系型数据库.它主要用做地址簿查询(如 email 客户端)或对各种服务访问做后台认证以及用户数据权 ...
- UVA 165 Stamps (DFS深搜回溯)
Stamps The government of Nova Mareterrania requires that various legal documents have stamps attac ...
- Jquery解析Json格式数据
今天稍微学习了一下Json,JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. JSON采用完全独立于语言的 ...