- 余辉
-
使用VS2005下的Visual Studio 2005 Command Prompt进入控制台模式(这个模式会自动设置各种环境变量)
、解压缩openssl的包,进入openssl的目录
、perl configure VC-WIN32
尽量在这个目录下执行该命令,否则找不到Configure文件,或者指定完整的Configure文件路径。
、msdo_ms
在解压目录下执行msdo_ms命令
、nmake -f ms tdll.mak编译后在openssl解压目录下执行,完成编译后。输出的文件在out32dll里面,包括应用程序的可执行文件、lib文件和dll文件
注意:在运行第五步时,cl编译器会抱怨说.cryptodesenc_read.c文件的read是The POSIX name for this item is deprecated(不被推荐的),建议使用_read。呵呵,我可不想将OpenSSL中的所有的read函数修改为_read。再看cl的错误代码 error C2220,于是上MSDN上查找:
warning treated as error - no object file generated
/WX tells the compiler to treat all warnings as errors. Since an error occurred, no object or executable file was generated.
是由于设置了/WX选项,将所有的警告都作为错误对待,所以。。。
于是打开OpenSSL目录下的MS目录下的ntdll.mak文件,将CFLAG的/WX选项去掉,存盘。
相关推荐
openssl命令详解
OpenSSL是一个安全套接字层密码库,其包括常用的密码算法、常用的密钥生成和证书封装管理功能及SSL协议,并提供了丰富的应用程序以供测试。 OpenSSL是一个开源的项目,其由三个部分组成: 1、openssl命令行工具; 2、libencrypt加密算法库; 3、libssl加密模块应用库; 这里主要学习下openssl命令工具的用法,openssl命令工具有两种运行模式: 交换模式 和 批处理模式 。直接输入openssl回车即可进入交互模式,而输入带命令选项的openssl命令则进行批处理模式。 利用OpenSSL作对称加密需要使用其子命令enc,其用法为: 其中常用的选项为: 使用案例 : OpenSSL单向加密的子命令为dgst,其语法如下: 其常用的选项为: 单向加密除了 openssl dgst 工具还有: md5sum,sha1sum,sha224sum,sha256sum ,sha384sum,sha512sum 使用案例 : 或 OpenSSL还支持生成密码的hash离散值,其子命令为passwd,语法如下: 常用选项为: 使用案例 : openssl命令也支持生成随机数,其子命令为rand,对应的语法为: 常用选项有: 使用案例 : 利用openssl命令的子命令genrsa生成私钥,然后再使用子命令rsa私钥中提取公钥。 genrsa的语法如下: 通常来说秘钥文件的权限一般只能由管理员访问,因此可以结合umask命令来设置生成的密钥文件的权限,如: 而随后可利用rsa子命令生成的私钥文件中提取公钥,rsa子命令的语法为: 常用选项为: -in FILENAME:指明私钥文件的存放路径; -out FILENAME:指明将公钥的保存路径; -pubout:根据提供的私钥,从中提取出公钥; 如: 在使用OpenSSL命令创建证书前,可查看配置文件/etc/pki/tls/openss.conf文件,查看该文件定义了的证书存放位置及名称。 1)创建自签证书 首先为CA提供所需的目录及文件,并指明证书的开始编号: 随后生成私钥,注意私钥的文件名及其存放的位置,需与配置文件中相匹配: 最后创建自签证书: 其中命令 openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650 用到子命令为req,其为证书请求及生成的工具,用到的选项解释为: 2)颁发证书 通常来说在CA签署颁发证书需要进行以下步骤: 上述命令用到了openssl命令的子命令CA,用于在CA服务器上签署或吊销证书。 上述查看证书使用了openssl命令的子命令x509,其选项解释为: 3)吊销证书 吊销证书的步骤通常为: -gencrl选项为根据/etc/pki/CA/index.txt文件中的信息生成crl文件。2023-08-06 13:24:101
OpenSSL 入门:密码学基础知识
本文是使用 OpenSSL 的密码学基础知识的两篇文章中的第一篇,OpenSSL 是在 Linux 和其他系统上流行的生产级库和工具包。(要安装 OpenSSL 的最新版本,请参阅 这里 。)OpenSSL 实用程序可在命令行使用,程序也可以调用 OpenSSL 库中的函数。本文的示例程序使用的是 C 语言,即 OpenSSL 库的源语言。 本系列的两篇文章涵盖了加密哈希、数字签名、加密和解密以及数字证书。你可以从 我的网站 的 ZIP 文件中找到这些代码和命令行示例。 让我们首先回顾一下 OpenSSL 名称中的 SSL。 安全套接字层 (Secure Socket Layer)(SSL)是 Netscape 在 1995 年发布的一种加密协议。该协议层可以位于 HTTP 之上,从而为 HTTPS 提供了 S: 安全(secure)。SSL 协议提供了各种安全服务,其中包括两项在 HTTPS 中至关重要的服务: SSL 有多个版本(例如 SSLv2 和 SSLv3),并且在 1999 年出现了一个基于 SSLv3 的类似协议 传输层安全性(Transport Layer Security)(TLS)。TLSv1 和 SSLv3 相似,但不足以相互配合工作。不过,通常将 SSL/TLS 称为同一协议。例如,即使正在使用的是 TLS(而非 SSL),OpenSSL 函数也经常在名称中包含 SSL。此外,调用 OpenSSL 命令行实用程序以 openssl 开始。 除了 man 页面之外,OpenSSL 的文档是零零散散的,鉴于 OpenSSL 工具包很大,这些页面很难以查找使用。命令行和代码示例可以将主要主题集中起来。让我们从一个熟悉的示例开始(使用 HTTPS 访问网站),然后使用该示例来选出我们感兴趣的加密部分进行讲述。 此处显示的 client 程序通过 HTTPS 连接到 Google: 可以从命令行编译和执行该程序(请注意 -lssl 和 -lcrypto 中的小写字母 L): 该程序尝试打开与网站 www.google.com 的安全连接。在与 Google Web 服务器的 TLS 握手过程中,client 程序会收到一个或多个数字证书,该程序会尝试对其进行验证(但在我的系统上失败了)。尽管如此,client 程序仍继续通过安全通道获取 Google 主页。该程序取决于前面提到的安全工件,尽管在上述代码中只着重突出了数字证书。但其它工件仍在幕后发挥作用,稍后将对它们进行详细说明。 通常,打开 HTTP(非安全)通道的 C 或 C++ 的客户端程序将使用诸如文件描述符或网络套接字之类的结构,它们是两个进程(例如,这个 client 程序和 Google Web 服务器)之间连接的端点。另一方面,文件描述符是一个非负整数值,用于在程序中标识该程序打开的任何文件类的结构。这样的程序还将使用一种结构来指定有关 Web 服务器地址的详细信息。 这些相对较低级别的结构不会出现在客户端程序中,因为 OpenSSL 库会将套接字基础设施和地址规范等封装在更高层面的安全结构中。其结果是一个简单的 API。下面首先看一下 client 程序示例中的安全性详细信息。 在与 Web 服务器握手期间,client 程序会接收一个或多个数字证书,以认证服务器的身份。但是,client 程序不会发送自己的证书,这意味着这个身份验证是单向的。(Web 服务器通常配置为 不 需要客户端证书)尽管对 Web 服务器证书的验证失败,但 client 程序仍通过了连接到 Web 服务器的安全通道继续获取 Google 主页。 为什么验证 Google 证书的尝试会失败?典型的 OpenSSL 安装目录为 /etc/ssl/certs,其中包含 ca-certificates.crt 文件。该目录和文件包含着 OpenSSL 自带的数字证书,以此构成 信任库(truststore)。可以根据需要更新信任库,尤其是可以包括新信任的证书,并删除不再受信任的证书。 client 程序从 Google Web 服务器收到了三个证书,但是我的计算机上的 OpenSSL 信任库并不包含完全匹配的证书。如目前所写,client 程序不会通过例如验证 Google 证书上的数字签名(一个用来证明该证书的签名)来解决此问题。如果该签名是受信任的,则包含该签名的证书也应受信任。尽管如此,client 程序仍继续获取页面,然后打印出 Google 的主页。下一节将更详细地介绍这些。 让我们从客户端示例中可见的安全工件(数字证书)开始,然后考虑其他安全工件如何与之相关。数字证书的主要格式标准是 X509,生产级的证书由诸如 Verisign 的 证书颁发机构(Certificate Authority)(CA)颁发。 数字证书中包含各种信息(例如,激活日期和失效日期以及所有者的域名),也包括发行者的身份和数字签名(这是加密过的加密哈希值)。证书还具有未加密的哈希值,用作其标识指纹。 哈希值来自将任意数量的二进制位映射到固定长度的摘要。这些位代表什么(会计报告、小说或数字电影)无关紧要。例如, 消息摘要版本 5(Message Digest version 5)(MD5)哈希算法将任意长度的输入位映射到 128 位哈希值,而 SHA1( 安全哈希算法版本 1(Secure Hash Algorithm version 1))算法将输入位映射到 160 位哈希值。不同的输入位会导致不同的(实际上在统计学上是唯一的)哈希值。下一篇文章将会进行更详细的介绍,并着重介绍什么使哈希函数具有加密功能。 数字证书的类型有所不同(例如根证书、中间证书和最终实体证书),并形成了反映这些证书类型的层次结构。顾名思义,根证书位于层次结构的顶部,其下的证书继承了根证书所具有的信任。OpenSSL 库和大多数现代编程语言都具有 X509 数据类型以及处理此类证书的函数。来自 Google 的证书具有 X509 格式,client 程序会检查该证书是否为 X509_V_OK。 X509 证书基于 公共密钥基础结构(public-key infrastructure)(PKI),其中包括的算法(RSA 是占主导地位的算法)用于生成密钥对:公共密钥及其配对的私有密钥。公钥是一种身份: Amazon 的公钥对其进行标识,而我的公钥对我进行标识。私钥应由其所有者负责保密。 成对出现的密钥具有标准用途。可以使用公钥对消息进行加密,然后可以使用同一个密钥对中的私钥对消息进行解密。私钥也可以用于对文档或其他电子工件(例如程序或电子邮件)进行签名,然后可以使用该对密钥中的公钥来验证签名。以下两个示例补充了一些细节。 在第一个示例中,Alice 将她的公钥分发给全世界,包括 Bob。然后,Bob 用 Alice 的公钥加密邮件,然后将加密的邮件发送给 Alice。用 Alice 的公钥加密的邮件将可以用她的私钥解密(假设是她自己的私钥),如下所示: 理论上可以在没有 Alice 的私钥的情况下解密消息,但在实际情况中,如果使用像 RSA 这样的加密密钥对系统,则在计算上做不到。 现在,第二个示例,请对文档签名以证明其真实性。签名算法使用密钥对中的私钥来处理要签名的文档的加密哈希: 假设 Alice 以数字方式签署了发送给 Bob 的合同。然后,Bob 可以使用 Alice 密钥对中的公钥来验证签名: 假若没有 Alice 的私钥,就无法轻松伪造 Alice 的签名:因此,Alice 有必要保密她的私钥。 在 client 程序中,除了数字证书以外,这些安全性都没有明确展示。下一篇文章使用使用 OpenSSL 实用程序和库函数的示例填充更多详细的信息。 同时,让我们看一下 OpenSSL 命令行实用程序:特别是在 TLS 握手期间检查来自 Web 服务器的证书的实用程序。调用 OpenSSL 实用程序可以使用 openssl 命令,然后添加参数和标志的组合以指定所需的操作。 看看以下命令: 该输出是组成 加密算法套件(cipher suite)()的相关算法的列表。下面是列表的开头,加了澄清首字母缩写词的注释: 下一条命令使用参数 s_client 将打开到 www.google.com 的安全连接,并在屏幕上显示有关此连接的所有信息: 诸如 Google 之类的主要网站通常会发送多个证书进行身份验证。 输出以有关 TLS 会话的摘要信息结尾,包括加密算法套件的详细信息: client 程序中使用了协议 TLS 1.2,Session-ID 唯一地标识了 openssl 实用程序和 Google Web 服务器之间的连接。Cipher 条目可以按以下方式进行解析: 加密算法套件正在不断发展中。例如,不久前,Google 使用 RC4 流加密算法(RSA 的 Ron Rivest 后来开发的 Ron"s Cipher 版本 4)。 RC4 现在有已知的漏洞,这大概部分导致了 Google 转换为 AES128。 我们通过安全的 C Web 客户端和各种命令行示例对 OpenSSL 做了首次了解,使一些需要进一步阐明的主题脱颖而出。 下一篇文章会详细介绍 ,从加密散列开始,到对数字证书如何应对密钥分发挑战为结束的更全面讨论。 via: https://opensource.com/article/19/6/cryptography-basics-openssl-part-1 作者: Marty Kalin 选题: lujun9972 译者: wxy 校对: wxy2023-08-06 13:24:161
openssl是什么软件
openssl是一个开放源代码的软件库包软件。应用程序可以使用这个软件库包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个软件库包广泛被应用在互联网的网页服务器上。作为一个基于密码学的安全开发包,openssl提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及ssl协议,并提供了丰富的应用程序供测试或别的目的使用。openssl整个软件库包大概可以分成三个主要的功能部分,分别是ssl协议库、应用程序以及密码算法库。openssl的目录结构自然也是围绕这三个功能部分进行规划的。openssl特点:1、数据保密性。信息加密就是把明码的输入文件用加密算法转换成加密的文件以实现数据的保密。加密的过程需要用到密钥来加密数据然后再解密。没有了密钥,就无法解开加密的数据。数据加密之后,只有密钥要用一个安全的方法传送。加密过的数据可以公开地传送。2、数据完整性。加密也能保证数据的一致性。例如:消息验证码,能够校验用户提供的加密信息,接收者可以用MAC来校验加密数据,保证数据在传输过程中没有被篡改过。3、安全验证。加密的另外一个用途是用来作为个人的标识,用户的密钥可以作为他的安全验证的标识。ssl是利用公开密钥的加密技术来作为用户端与服务器端在传送机密资料时的加密通讯协定。2023-08-06 13:24:231
Linux里面openssl作用是什么?
主要是用来安全的。openssl命令 – 加密算法openSSL是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。对应的命令就是openssl命令,用于加密算法。《Linux就该这么学》语法格式:openssl [参数]举例子:用SHA1算法计算文件file.txt的哈西值,输出到stdout:# openssl dgst -sha1 file.txt2023-08-06 13:25:026
OpenSSL之配置文件用法
OpenSSL配置文件采用linux风格,其文件格式由分组字段名、属性名、属性值三部分组成。 如下面的例子: 其中,属性值还支持变量替换,如该例的属性: log = $path/log 其值最终会被替换为./module_a/log 本文假设你已经安装好了OpenSSL,并且持有一份1.1.1的源码。 配置文件相关的头文件为conf.h、源文件实现在crypto/conf目录中。 这个结构定义了单个配置项的数据结构。主要字段含义: section —— 表示一个配置段的名称。 name —— 表示在该配置段下的属性名称。 value —— 表示对应属性的值。 这个结构定义了配置抽象方法集合。主要字段含义: name —— 配置方法名称。 create —— 根据配置抽象方法,创建一个配置项结构,返回其指针。 init —— 初使化配置。 destroy —— 释放所有配置。 destroy_data —— 仅释放所有配置项数据,不释放配置本身。 load_bio —— 以BIO的方式加载配置。 dump —— 打印配置项到BIO中。 is_number —— 判断指定字符是否数字。 to_int —— 将字符转换为数字。 load —— 从文件(重新)加载所有配置。 这个结构定义了配置存储数据结构。主要字段含义: meth —— 抽象方法集合。 meth_data —— 附加的内存数据,暂时还没有明确用途。 data —— 配置项哈希表。 在1.1.1中,大多数的数据结构已经不再向使用者开放,从封装的角度来看,这是更合理的。如果你在头文件中找不到结构定义,不妨去源码中搜一搜。 CONF *NCONF_new(CONF_METHOD *meth); 指定一个抽象方法集合,创建配置存储结构。 成功返回有效指针,失败返回NULL。 如果meth传入NULL,表示使用默认的抽象方法。 void NCONF_free(CONF *conf); 释放配置存储。 int NCONF_load(CONF *conf, const char *file, long *eline); 从指定文件加载配置,eline表示出错时输出的行号。 成功返回1,失败返回0。 int NCONF_load_bio(CONF *conf, BIO *bp, long *eline); 从BIO加载配置,eline表示出错时输出的行号。 成功返回1,失败返回0。 int NCONF_load_fp(CONF *conf, FILE *fp, long *eline); NCONF_load_bio()的FILE版本。 char *NCONF_get_string(const CONF *conf, const char *group, const char *name); 从配置中,获取指定分组下的属性值。 成功返回C风格字符串,失败返回NULL。 若group传NULL,表示取全局属性。 int NCONF_get_number_e(const CONF *conf, const char *group, const char *name, long *result); 从配置中,获取指定分组下的数字属性值,数字值输出到result中。 成功返回1,失败返回0。 若group传NULL,表示取全局属性。 STACK_OF(CONF_VALUE) *NCONF_get_section(const CONF *conf, const char *section); 返回指定分组下的配置项堆栈集合。section不能为NULL。 成功返回有效堆栈指针,失败返回NULL。 下面这个例子演示了使用配置API进行基本的文件操作。 test.cnf文件内容: user = root [module_a] path = ./module_a log = $path/log filecount = 10 输出: global user:[root] module_a::path:[./module_a] module_a::log:[./module_a/log] ret:[1] module_a::filecount:[10] 下面这个例子演示了使用BIO读取配置文件,并且遍历指定的分组。 输出: section:[module_a] name:[path] value:[./module_a] section:[module_a] name:[log] value:[./module_a/log] section:[module_a] name:[filecount] value:[10]2023-08-06 13:25:161
openssl——自签名根证书、签名客户端和服务器证书
openssl genrsa -out root.key 2048 也可以是pem文件,也可为了区分这是私钥而改用key后缀名,内容如下: 查看详细解析:包含两个大素数和两个指数和一个系数 openssl rsa -in root.key -text 可通过命令提取公钥: openssl rsa -pubout -in root.key openssl req -new -out root-req.csr -key root.key -keyform PEM -keyform PEM:证书有pem和der格式之分,前者文本,多用于java和windows服务器,后者二进制 CSR是Certificate Signing Request的英文缩写,即证书请求文件 openssl x509 -req -in root-req.csr -out root-cert.cer -signkey root.key -CAcreateserial -days 365 -CAcreateserial ,创建证书序列号,使用此选项,当CA序列号文件不存在时将被创建:它将包含序列号“02”,正在签名的证书将具有1作为其序列号。通常如果指定了-CA选项并且序列号文件不存在,则会出现错误。 -days 据说3650天有时候会意外导致证书验证失败,没遇到过 此处可有pem、crt、cer多种输出格式,其实内容都一样,来试一下: 每次生成的证书都不一样,但是未发现不同后缀名下的证书格式不同。 我的理解: pem是最基本的编码格式,der也相同。 CRT文件是由第三方证书颁发机构(例如VeriSign或DigiCert)提供和生成的安全文件,ASCII编码格式。 cer是crt的微软形式。 为了统一,全使用cer格式。 可选择将证书和私钥导入密钥库,通常用p12和jks( Java Key Store)格式: openssl pkcs12 -export -in root-cert.cer -inkey root.key -out root.p12 -name "lab" 需要加密保护, -name 设置别名 然后可选择使用keytool将p12转为jks格式,此处就不做转换了。 步骤基本相同 步骤基本相同 openssl genrsa -out server-key.key 2048 openssl req -new -out server-req.csr -key server-key.key -keyform PEM openssl x509 -req -in server-req.csr -out server-cert.cer -CA F:CERTmycert testopensslwin oot oot-cert.cer -CAkey F:CERTmycert estopensslwin oot oot.key -CAcreateserial -days 360 openssl pkcs12 -export -in server-cert.cer -inkey server-key.key -out server. p12 -name "lab-server" 运行环境要包含完整证书链。需要将证书链放到系统可信目录下。 为证书绑定ip,只能通过config文件, 文件如下【可将常用参数写入,生成请求文件时直接enter即可】: 使用配置文件时在生成请求文件和签发证书时的参数不同: 生成请求文件: openssl req -new -out server-req1.csr -key server-key.key -keyform PEM -extensions v3_req -config openssl. cnf 签发证书: openssl x509 -req -in server-req1.csr -out server-cert1.cer -CA F:CERTmycert estopensslwin oot oot- cert.cer -CAkey F:CERTmycert estopensslwin oot oot.key -CAcreateserial -days 360 -extensions v3_req -extfile openssl.cnf 默认证书链长度为2,使用中间ca签发时,中间ca的生成需要在配置文件中加修改长度参数: [ v3_ca ] basicConstraints = CA:true,pathlen:3 Note: 参考: OpenSSL主配置文件openssl.cnf 利用OpenSSL创建证书链并应用于IIS7 openssl系列文章: http://www.cnblogs.com/f-ck-need-u/p/7048359.html2023-08-06 13:25:221
OpenSSL详解
OpenSSL初接触的人恐怕最难的在于先理解各种概念 公钥/私钥/签名/验证签名/加密/解密/非对称加密 我们一般的加密是用一个密码加密文件,然后解密也用同样的密码.这很好理解,这个是对称加密.而有些加密时,加密用的一个密码,而解密用另外一组密码,这个叫非对称加密,意思就是加密解密的密码不一样.初次接触的人恐怕无论如何都理解不了.其实这是数学上的一个素数积求因子的原理的应用,如果你一定要搞懂,百度有大把大把的资料可以看,其结果就是用这一组密钥中的一个来加密数据,可以用另一个解开.是的没错,公钥和私钥都可以用来加密数据,相反用另一个解开,公钥加密数据,然后私钥解密的情况被称为加密解密,私钥加密数据,公钥解密一般被称为签名和验证签名. 因为公钥加密的数据只有它相对应的私钥可以解开,所以你可以把公钥给人和人,让他加密他想要传送给你的数据,这个数据只有到了有私钥的你这里,才可以解开成有用的数据,其他人就是得到了,也看懂内容.同理,如果你用你的私钥对数据进行签名,那这个数据就只有配对的公钥可以解开,有这个私钥的只有你,所以如果配对的公钥解开了数据,就说明这数据是你发的,相反,则不是.这个被称为签名. 实际应用中,一般都是和对方交换公钥,然后你要发给对方的数据,用他的公钥加密,他得到后用他的私钥解密,他要发给你的数据,用你的公钥加密,你得到后用你的私钥解密,这样最大程度保证了安全性. RSA/DSA/SHA/MD5 非对称加密的算法有很多,比较著名的有RSA/DSA ,不同的是RSA可以用于加/解密,也可以用于签名验签,DSA则只能用于签名.至于SHA则是一种和md5相同的算法,它不是用于加密解密或者签名的,它被称为摘要算法.就是通过一种算法,依据数据内容生成一种固定长度的摘要,这串摘要值与原数据存在对应关系,就是原数据会生成这个摘要,但是,这个摘要是不能还原成原数据的,嗯....,正常情况下是这样的,这个算法起的作用就是,如果你把原数据修改一点点,那么生成的摘要都会不同,传输过程中把原数据给你再给你一个摘要,你把得到的原数据同样做一次摘要算法,与给你的摘要相比较就可以知道这个数据有没有在传输过程中被修改了. 实际应用过程中,因为需要加密的数据可能会很大,进行加密费时费力,所以一般都会把原数据先进行摘要,然后对这个摘要值进行加密,将原数据的明文和加密后的摘要值一起传给你.这样你解开加密后的摘要值,再和你得到的数据进行的摘要值对应一下就可以知道数据有没有被修改了,而且,因为私钥只有你有,只有你能解密摘要值,所以别人就算把原数据做了修改,然后生成一个假的摘要给你也是不行的,你这边用密钥也根本解不开. CA/PEM/DER/X509/PKCS 一般的公钥不会用明文传输给别人的,正常情况下都会生成一个文件,这个文件就是公钥文件,然后这个文件可以交给其他人用于加密,但是传输过程中如果有人恶意破坏,将你的公钥换成了他的公钥,然后得到公钥的一方加密数据,不是他就可以用他自己的密钥解密看到数据了吗,为了解决这个问题,需要一个公证方来做这个事,任何人都可以找它来确认公钥是谁发的.这就是CA,CA确认公钥的原理也很简单,它将它自己的公钥发布给所有人,然后一个想要发布自己公钥的人可以将自己的公钥和一些身份信息发给CA,CA用自己的密钥进行加密,这里也可以称为签名.然后这个包含了你的公钥和你的信息的文件就可以称为证书文件了.这样一来所有得到一些公钥文件的人,通过CA的公钥解密了文件,如果正常解密那么机密后里面的信息一定是真的,因为加密方只可能是CA,其他人没它的密钥啊.这样你解开公钥文件,看看里面的信息就知道这个是不是那个你需要用来加密的公钥了. 实际应用中,一般人都不会找CA去签名,因为那是收钱的,所以可以自己做一个自签名的证书文件,就是自己生成一对密钥,然后再用自己生成的另外一对密钥对这对密钥进行签名,这个只用于真正需要签名证书的人,普通的加密解密数据,直接用公钥和私钥来做就可以了. 密钥文件的格式用OpenSSL生成的就只有PEM和DER两种格式,PEM的是将密钥用base64编码表示出来的,直接打开你能看到一串的英文字母,DER格式是二进制的密钥文件,直接打开,你可以看到........你什么也看不懂!.X509是通用的证书文件格式定义.pkcs的一系列标准是指定的存放密钥的文件标准,你只要知道PEM DER X509 PKCS这几种格式是可以互相转化的. == End http://www.cnblogs.com/phpinfo/archive/2013/08/09/3246376.html == 为了方便理解,我画了一个图,如下: 使用 openssl 生成证书(含openssl详解) 一、openssl 简介 openssl 是目前最流行的 SSL 密码库工具,其提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS 协议的实现。 官网: https://www.openssl.org/source/ 构成部分 密码算法库 密钥和证书封装管理功能 SSL通信API接口 用途 建立 RSA、DH、DSA key 参数 建立 X.509 证书、证书签名请求(CSR)和CRLs(证书回收列表) 计算消息摘要 使用各种 Cipher加密/解密 SSL/TLS 客户端以及服务器的测试 处理S/MIME 或者加密邮件 二、RSA密钥操作 默认情况下,openssl 输出格式为 PKCS#1-PEM 生成RSA私钥(无加密) openssl genrsa -out rsa_private.key 2048 生成RSA公钥 openssl rsa -in rsa_private.key -pubout -out rsa_public.key 生成RSA私钥(使用aes256加密) openssl genrsa -aes256 -passout pass:111111 -out rsa_aes_private.key 2048 其中 passout 代替shell 进行密码输入,否则会提示输入密码; 生成加密后的内容如: -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: AES-256-CBC,5584D000DDDD53DD5B12AE935F05A007 Base64 Encoded Data-----END RSA PRIVATE KEY----- 此时若生成公钥,需要提供密码 openssl rsa -in rsa_aes_private.key -passin pass:111111 -pubout -out rsa_public.key 其中 passout 代替shell 进行密码输入,否则会提示输入密码; 转换命令 私钥转非加密 openssl rsa -in rsa_aes_private.key -passin pass:111111 -out rsa_private.key 私钥转加密 openssl rsa -in rsa_private.key -aes256 -passout pass:111111 -out rsa_aes_private.key 私钥PEM转DER openssl rsa -in rsa_private.key -outform der-out rsa_aes_private.der -inform和-outform 参数制定输入输出格式,由der转pem格式同理 查看私钥明细 openssl rsa -in rsa_private.key -noout -text 使用-pubin参数可查看公钥明细 私钥PKCS#1转PKCS#8 openssl pkcs8 -topk8 -in rsa_private.key -passout pass:111111 -out pkcs8_private.key 其中-passout指定了密码,输出的pkcs8格式密钥为加密形式,pkcs8默认采用des3 加密算法,内容如下: -----BEGIN ENCRYPTED PRIVATE KEY----- Base64 Encoded Data -----END ENCRYPTED PRIVATE KEY----- 使用-nocrypt参数可以输出无加密的pkcs8密钥,如下: -----BEGIN PRIVATE KEY----- Base64 Encoded Data -----END PRIVATE KEY----- 三、生成CA自签名证书和RSA私钥(测试场景步骤) 测试场景步骤1:生成 RSA 私钥和自签名证书: openssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 36500 -out cert.crt 注释: 操作步骤如下:提示填写过程中如果想删除填写的内容,用ctrl+Backspace删除前面的字符 [root@szxelab01-web-100 cert]# openssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 36500 -out cert.crt Generating a 2048 bit RSA private key .............+++ ........................+++ writing new private key to "rsa_private.key" You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter ".", the field will be left blank. Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:GuangDong Locality Name (eg, city) [Default City]:ShenZhen Organization Name (eg, company) [Default Company Ltd]:SunFoBank Organizational Unit Name (eg, section) []:IT Dept Common Name (eg, your name or your server"s hostname) []:sunfobank.com Email Address [] :admin@sunfobank.com [root@szxjdwins01-web-27 cert]# ll total 8 -rw-r--r--. 1 root root 1452 Jun 22 14:29 cert.crt -rw-r--r--. 1 root root 1708 Jun 22 14:29 rsa_private.key openssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 36500 -out cert.crt -subj "/C=CN/ST=GuangDong/L=ShenZhen/O=SunFoBank/OU=IT Dept/CN= sunfobank.com/emailAddress=admin@sunfobank.com " openssl req -new -x509 -days 36500 -key rsa_private.key -out cert.crt 四、生成服务器签名请求文件及CA 签名颁发服务器证书() server.key建议不要加密码,如果加密码,重启nginx的时候每次都需要密码才可以启动nginx影响效率。 nginx配置只需要server.key和server.crt两个文件。 openssl genrsa -aes256 -passout pass:111111 -out server.key 2048 openssl req -new -key server.key -out server.csr [root@szxjdwins01-web-27 cert]# openssl genrsa -aes256 -passout pass:111111 -out server.key 2048 Generating RSA private key, 2048 bit long modulus ............................+++ .......+++ e is 65537 (0x10001) [root@szxjdwins01-web-27 cert]# openssl genrsa -aes256 -out server.key 2048 Generating RSA private key, 2048 bit long modulus .............................................+++ ........................................................+++ e is 65537 (0x10001) Enter pass phrase for server.key: 111111手动输入密码 Verifying - Enter pass phrase for server.key: 111111手动输入密码 [root@szxelab01-web-27 cert]# openssl req -new -key server.key -out server.csr Enter pass phrase for server.key: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter ".", the field will be left blank. Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:GuangDong Locality Name (eg, city) [Default City]:ShenZhen Organization Name (eg, company) [Default Company Ltd]:SunFoBank Organizational Unit Name (eg, section) []:IT Dept Common Name (eg, your name or your server"s hostname) []:sunfobank.com Email Address [] :admin@sunfobank.com Please enter the following "extra" attributes to be sent with your certificate request A challenge password []: 不输入密码 An optional company name []: 不输入密码 此后输入密码、server证书信息完成,也可以命令行指定各类参数 openssl req -new -key server.key -passin pass:111111 -out server.csr -subj "/C=CN/ST=GuangDong/L=ShenZhen/O=SunFoBank/OU=IT Dept/CN= sunfobank.com/emailAddress=admin@sunfobank.com " *** 此时生成的 csr签名请求文件可提交至 CA进行签发 *** cat server.csr -----BEGIN CERTIFICATE REQUEST----- Base64EncodedData -----END CERTIFICATE REQUEST----- openssl req -noout -text -in server.csr openssl x509 -req -days 365000 -in server.csr -CA cert.crt -CAkey rsa_private.key -passin pass:111111 -CAcreateserial -out server.crt [root@szxelab01-web-27 cert]# openssl x509 -req -days 365000 -in server.csr -CA cert.crt -CAkey rsa_private.key -passin pass:111111 -CAcreateserial -out server.crt Signature ok subject=/C=CN/ST=GuangDong/L=ShenZhen/O=SunFoBank/OU=IT Dept/CN= sunfobank.com/emailAddress=admin@sunfobank.com Getting CA Private Key 其中 CAxxx 选项用于指定CA 参数输入 [root@szxelab01-web-27 cert]# ll total 24 -rw-r--r--. 1 root root 1452 Jun 22 14:29 cert.crt -rw-r--r--. 1 root root 17 Jun 22 15:07 cert.srl -rw-r--r--. 1 root root 1708 Jun 22 14:29 rsa_private.key -rw-r--r--. 1 root root 1334 Jun 22 15:07 server.crt -rw-r--r--. 1 root root 1070 Jun 22 15:04 server.csr -rw-r--r--. 1 root root 1766 Jun 22 14:54 server.key 此时对nginx任何操作,都需要提示输入server.key的密码才可以执行。 [root@szxelab01-web-27 nginx]# /application/nginx/sbin/nginx -t Enter PEM pass phrase: 输入密码111111 nginx: the configuration file /application/nginx-1.12.2//conf/nginx.conf syntax is ok 为例不输入密码,需要把加密server.key转换成不加密的server.key [root@szxelab01-web-27 cert]# openssl rsa -in server.key -passin pass:111111 -out server.key writing RSA key 此时nginx操作就不提示输入密码了: [root@szxelab01-web-27 cert]# /application/nginx/sbin/nginx -t nginx: the configuration file /application/nginx-1.12.2//conf/nginx.conf syntax is ok nginx: configuration file /application/nginx-1.12.2//conf/nginx.conf test is successful 证书位置: [root@szxelab01-web-27 cert]# pwd /application/nginx/cert [root@szxelab01-web-27 cert]# ll total 24 -rw-r--r--. 1 root root 1452 Jun 22 14:29 cert.crt -rw-r--r--. 1 root root 17 Jun 22 15:07 cert.srl -rw-r--r--. 1 root root 1708 Jun 22 14:29 rsa_private.key -rw-r--r--. 1 root root 1334 Jun 22 15:07 server.crt -rw-r--r--. 1 root root 1070 Jun 22 15:04 server.csr -rw-r--r--. 1 root root 1679 Jun 22 15:19 server.key 至此测试场景私有证书配置完成 五、证书查看及转换 查看证书细节 openssl x509 -in cert.crt -noout -text 转换证书编码格式 openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem 合成 pkcs#12 证书(含私钥) ** 将 pem 证书和私钥转 pkcs#12 证书 ** openssl pkcs12 -export -in server.crt -inkey server.key -passin pass:111111 -password pass:111111 -out server.p12 其中-export指导出pkcs#12 证书,-inkey 指定了私钥文件,-passin 为私钥(文件)密码(nodes为无加密),-password 指定 p12文件的密码(导入导出) ** 将 pem 证书和私钥/CA 证书 合成pkcs#12 证书** openssl pkcs12 -export -in server.crt -inkey server.key -passin pass:111111 -chain -CAfile ca.crt -password pass:111111 -out server-all.p12 其中-chain指示同时添加证书链,-CAfile 指定了CA证书,导出的p12文件将包含多个证书。(其他选项:-name可用于指定server证书别名;-caname用于指定ca证书别名) ** pcks#12 提取PEM文件(含私钥) ** openssl pkcs12 -in server.p12 -password pass:111111 -passout pass:111111 -out out/server.pem 其中-password 指定 p12文件的密码(导入导出),-passout指输出私钥的加密密码(nodes为无加密) 导出的文件为pem格式,同时包含证书和私钥(pkcs#8): Bag Attributes localKeyID: 97 DD 46 3D 1E 91 EF 01 3B 2E 4A 75 81 4F 11 A6 E7 1F 79 40 subject=/C=CN/ST=GD/L=SZ/O=vihoo/OU=dev/CN= vihoo.com/emailAddress=yy@vihoo.com issuer=/C=CN/ST=GD/L=SZ/O=viroot/OU=dev/CN= viroot.com/emailAddress=yy@viroot.com-----BEGIN CERTIFICATE-----MIIDazCCAlMCCQCIOlA9/dcfEjANBgkqhkiG9w0BAQUFADB5MQswCQYDVQQGEwJD 1LpQCA+2B6dn4scZwaCD-----END CERTIFICATE-----Bag Attributes localKeyID: 97 DD 46 3D 1E 91 EF 01 3B 2E 4A 75 81 4F 11 A6 E7 1F 79 40 Key Attributes: <No Attributes> -----BEGIN ENCRYPTED PRIVATE KEY-----MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDC/6rAc1YaPRNf K9ZLHbyBTKVaxehjxzJHHw== -----END ENCRYPTED PRIVATE KEY----- 仅提取私钥 openssl pkcs12 -in server.p12 -password pass:111111 -passout pass:111111 -nocerts -out out/key.pem 仅提取证书(所有证书) openssl pkcs12 -in server.p12 -password pass:111111 -nokeys -out out/key.pem 仅提取ca证书 openssl pkcs12 -in server-all.p12 -password pass:111111 -nokeys -cacerts -out out/cacert.pem 仅提取server证书 openssl pkcs12 -in server-all.p12 -password pass:111111 -nokeys -clcerts -out out/cert.pem 六、openssl 命令参考2023-08-06 13:25:301
openssl插件有什么用
OpenSSL的作用:是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。 SSL是SecureSocketsLayer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。网景Netscape公司在推出第一个Web浏览器的同时,提出了SSL协议标准。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。已经成为Internet上保密通讯的工业标准。2023-08-06 13:25:381
OpenSSL之内存用法
用户在使用内存时,容易犯的错误就是内存泄露。当用户调用内存分配和释放函数时,查找内存泄露比较麻烦。OpenSSL提供了内置的内存分配/释放函数。如果用户完全调用OpenSSL的内存分配和释放函数,可以方便的找到内存泄露点。OpenSSL分配内存时,在其内部维护一个内存分配哈希表,用于存放已经分配但未释放的内存信息。当用户申请内存分配时,在哈希表中添加此项信息,内存释放时删除该信息。当用户通过OpenSSL函数查找内存泄露点时,只需查询该哈希表即可。用户通过OpenSSL回调函数还能处理那些泄露的内存。 本文假设你已经安装好了OpenSSL,并且持有一份1.1.1的源码。 内存相关的头文件为crypto.h、源文件在crypto目录中,文件名模式为mem*.c。 这个结构定义了内存块的分配信息。主要字段含义: addr —— 分配的内存地址。 num —— 分配的内存大小。 file —— 分配内存的文件名。 file —— 分配内存的行号。 threadid —— 分配内存的线程ID。 在1.1.1中,大多数的数据结构已经不再向使用者开放,从封装的角度来看,这是更合理的。如果你在头文件中找不到结构定义,不妨去源码中搜一搜。 int CRYPTO_set_mem_functions( void ( m) (size_t, const char *, int), void ( r) (void *, size_t, const char , int), void ( f) (void *, const char , int)); 成功返回1,失败返回0。 void CRYPTO_get_mem_functions( void ( m) (size_t, const char , int), void ( r) (void , size_t, const char , int), void ( f) (void *, const char *, int)); 这两个函数用于设置和读取与内存分配和释放相关的三个函数,这三个函数默认分别为: static void ( malloc_impl)(size_t, const char *, int) = CRYPTO_malloc; static void ( realloc_impl)(void *, size_t, const char , int) = CRYPTO_realloc; static void ( free_impl)(void *, const char *, int) = CRYPTO_free; 这两个函数只允许在内存分配前即初使化时调用。 int CRYPTO_set_mem_debug(int flag); 设置是否开启内存调试。取值1或0,1表示打开。 成功返回1,失败返回0。 只允许在内存分配前即初使化时调用。 void *CRYPTO_malloc(size_t num, const char *file, int line); void *CRYPTO_zalloc(size_t num, const char *file, int line); void *CRYPTO_realloc(void *addr, size_t num, const char *file, int line); CRYPTO_free(void *ptr, const char *file, int line); 这几个函数用于分配和释放内存。 是否记录内存与CRYPTO_set_mem_debug()的开关有关。 int CRYPTO_mem_ctrl(int mode); 这个函数用于设置是否开启内存记录模式,参数取值为: # define CRYPTO_MEM_CHECK_OFF 0x0 # define CRYPTO_MEM_CHECK_ON 0x1 返回旧模式。 注:我没有在头文件中看到像老版函数CRYPTO_is_mem_check_on()一样可以查询当前开关状态的用法,但是通过查看源码,发现可以对CRYPTO_mem_ctrl()传递一个不存在的类型(比如-1)使其返回当前状态。 int CRYPTO_mem_leaks_cb(int (*cb) (const char *str, size_t len, void *u), void *u); 遍历记录的内存,用于打印内存泄露信息。 返回是否有内存汇露。分别取值1和0。 int CRYPTO_mem_leaks(BIO *bio); 打印内存泄露信息,输出到BIO中。 返回是否有内存汇露。分别取值1和0。 int CRYPTO_mem_leaks_fp(FILE *); CRYPTO_mem_leaks()的FILE版本。 由于OpenSSL内部涉及地数据结构众多,如果采用原始的内存操作函数,因为涉及到文件名和行号会比较麻烦。因此,OpenSSL定义了一组宏进行包装,方便使用者进行调用。定义如下: 下面这个例子演示了使用OpenSSl内存分配API进行操作。同时还用到了placement new()的用法,演示如何在openssl的内存分配串上创建c++对象。 如果在编译过程中出现下面这个错误: testmem.cpp:40:42: 错误:‘CRYPTO_mem_leaks_cb"在此作用域中尚未声明 CRYPTO_mem_leaks_cb(memleak_cb, "aaa"); 解决办法是开启debug调试编译,命令如下: ./config --prefix=/usr/local/openssl enable-crypto-mdebug enable-crypto-mdebug-backtrace 输出: old switch:0 @SNode::SNode name:[abc] age:[18] @SNode::~SNode name:[abc] age:[0] leak info:[[02:21:40] 1 file=testmem.cpp, line=46, thread=140607514695488, number=36, address=0x204f090 ] ##> ./testmem() [0x4044e3] ##> ./testmem(CRYPTO_malloc+0xa3) [0x4035e3] ##> ./testmem() [0x40329c] ##> /lib64/libc.so.6(__libc_start_main+0xf5) [0x7fe1bbb77555] ##> ./testmem() [0x4030f3] leak info:[36 bytes leaked in 1 chunks ]2023-08-06 13:25:441
win7如何安装openssl|win7安装openssl的方法
openssl是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议。很多win732位系统的用户在安装openssl的过程中都遇到了各种棘手的问题,走了很多弯路,那么在win7如何安装openssl呢?下面由小编给大家介绍一下win7安装openssl的方法。安装步骤:1、进入ActivePerl官网下载ActivePerl5.24.364位;2、ActivePerl下载并安装完成后,添加环境变量,打开“计算机属性--高级系统设置--环境变量”,选中“path”,点击“编辑”按钮,如果ActivePerl安装在C:Perl64目录下,则把“C:Perl64sitein;C:Perl64in;”加入其中,确认即可;3、按下“Win+R”快捷键打开运行,输入“cmd”点击确定打开命令提示符,然后输入“perl-v”,按回车,如果显示出下面内容,就说明是成功的;4、接下来要安装MicrosoftVisualStudio2010;5、将“C:ProgramFiles(x86)MicrosoftVisualStudio10.0VCinamd64;”加入系统环境变量(系统在Path路径中可能已添加C:ProgramFiles(x86)MicrosoftVisualStudio10.0VCin,如果没有就添加上);6、安装NASM,完成安装后同样将其安装路径加入到到系统环境变量Path中.例如:“C:UserslenovoAppDataLocalNASM”;7、然后下载OpenSSL,将其解压缩至磁盘根目录下;7、打开“开始”菜单,进入“所有程序”,找到在VisualStudioTools文件夹下的VisualStudiox64Win64命令提示(2010)工具;8、进入VisualStudio2010安装目录“C:ProgramFiles(x86)MicrosoftVisualStudio10.0”,输入“cdC:ProgramFiles(x86)MicrosoftVisualStudio10.0VCinamd64”按下回车,然后再输入“vcvars64.bat”,按下回车执行命令。9、首先将命令指向你的openssl目录下,输入“cdC:openssl”,按下回车;10、接着输入“perlConfigureVC-WIN64no-asm--prefix=C:openssl”,按下回车;注:当你下载的openssl是高版本的话,如openssl-1.0.2g,需要在这里加上no-asm,表示不使用汇编,如果你不加上的话,在执行nmake命令时会出错。但是如果下载是openssl-1.0.1c,按理说不用加no-asm也可以成功。11、接着输入:perlConfigureVC-WIN64AperlConfigureVC-WIN64A--perfix=C:opensslwin64按自己电脑中的路径来;12、然后输入命令:msdo_nasm;13、输入命令:msdo_win64a,按下回车;14、将命令提示符定位到C:ProgramFiles(x86)MicrosoftVisualStudio10.0VCinamd64(VS2010安装位置),然后输入vcvars64.bat,会显示SettingenvironmentforusingMicrosoftVisualStudio2010x64tools.(必须要进行操作)15、再次将命令提示符定位到openssl源码目录下cdC:openssl,输入命令:nmake-fms t.mak;执行完后会在openssl-1.0.1g目录下生成out32和tmp32两个文件夹,out32文件夹中会生成两个静态库和一些执行文件,tmp32文件夹中会生成相应的汇编文件。16、然后输入命令:nmake-fms t.maktest检查上一步编译是否成功,如果成功则最后显示“passedalltests”字样,如图:17、最后执行命令:nmake-fms t.makinstall操作完成!以上就是win7如何安装openssl|win7安装openssl的方法的全部内容了,不知道openssl如何安装的朋友可以试试以上步骤。2023-08-06 13:26:031
OpenSSL之EVP用法
OpenSSL EVP(high-level cryptographic functions)提供了丰富的密码学中的各种函数。OpenSSL中实现了各种对称算法、摘要算法以及签名/验签算法。EVP函数将这些具体的算法进行了封装。 EVP主要封装了如下功能函数: 1)实现了BASE64编解码BIO; 2)实现了加解密BIO; 3)实现了摘要BIO; 4)实现了reliable BIO; 5)封装了摘要算法; 6)封装了对称加解密算法; 7)封装了非对称密钥的加密(公钥)、解密(私钥)、签名与验证以及辅助函数; 8)基于口令的加密(PBE); 9)对称密钥处理; 10)数字信封:数字信封用对方的公钥加密对称密钥,数据则用此对称密钥加密。发送给对方时,同时发送对称密钥密文和数据密文。接收方首先用自己的私钥解密密钥密文,得到对称密钥,然后用它解密数据。 11)其他辅助函数。 本文假设你已经安装好了OpenSSL,并且持有一份1.1.1的源码。 EVP相关的头文件在evp.h中、源文件在crypto/evp目录中。 由于EVP的功能过于强大,再加上我的精力和水平有限,暂时只对部分功能进行摘录和说明。 这个结构定义了摘要算法的抽象方法。主要字段含义: type —— 摘要算法的NID。 pkey_type —— 与摘要算法相关的密钥NID。 md_size —— 摘要值的输出大小。 flags —— 内部标志。 init —— 初使化函数。 update —— 输入计算函数。 final —— 输出计算函数。 copy —— 摘要运算上下文复制函数。 cleanup —— 摘要运算上下文清理函数。 block_size —— 摘要运算分组大小。 ctx_size —— 摘要运算分组缓冲区大小。 md_ctrl —— 摘要运算指令控制函数。 支持的摘要算法包括: const EVP_MD *EVP_md5(void); const EVP_MD *EVP_sha1(void); const EVP_MD *EVP_sha256(void); const EVP_MD *EVP_sha512(void); 拿EVP_md5()来说,其返回值为: 下面这几个函数查询md的属性信息: 有时我们对使用的摘要算法不熟悉,这几个函数很有帮助。 EVP_MD_CTX *EVP_MD_CTX_new(void); void EVP_MD_CTX_free(EVP_MD_CTX *ctx); 这两个函数用于创建和释放对称摘要上下文对象。 int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type); 初使化摘要上下文,type为摘要算法抽象集合。 成功返回1,失败返回0。 int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, size_t cnt); 向摘要计算的海棉结构输入一段数据。 成功返回1,失败返回0。 int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s); 生成最终摘要,输出摘要值和长度。 成功返回1,失败返回0。 int EVP_Digest(const void *data, size_t count, unsigned char *md, unsigned int *size, const EVP_MD *type, ENGINE *impl); 使用包装的一次性方法计算一段小数据的摘要。 成功返回1,失败返回0。 struct evp_cipher_st { int nid; int block_size; /* Default value for variable length ciphers / int key_len; int iv_len; / Various flags / unsigned long flags; / init key / int ( init) (EVP_CIPHER_CTX *ctx, const unsigned char *key, const unsigned char iv, int enc); / encrypt/decrypt data / int ( do_cipher) (EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char in, size_t inl); / cleanup ctx / int ( cleanup) (EVP_CIPHER_CTX ); / how big ctx->cipher_data needs to be / int ctx_size; / Populate a ASN1_TYPE with parameters / int ( set_asn1_parameters) (EVP_CIPHER_CTX *, ASN1_TYPE ); / Get parameters from a ASN1_TYPE / int ( get_asn1_parameters) (EVP_CIPHER_CTX *, ASN1_TYPE ); / Miscellaneous operations / int ( ctrl) (EVP_CIPHER_CTX *, int type, int arg, void ptr); / Application data */ void app_data; } / EVP_CIPHER */ ; typedef struct evp_cipher_st EVP_CIPHER; 这个结构定义了对称加密算法的抽象方法。主要字段含义: nid —— 加密算法的NID。 block_size —— 分组大小。 key_len —— 密钥长度。 iv_len —— 初使向量长度。 flags —— 内部标志。 init —— 初使化函数。 do_cipher —— 中间运算函数。 cleanup —— 最终运算函数。 ctx_size —— 上下文大小。 ctrl —— 控制函数。 app_data —— 应用程序数据。 支持的CIPHER抽象加解密算法包括: const EVP_CIPHER *EVP_des_ecb(void); const EVP_CIPHER *EVP_des_ede3(void); const EVP_CIPHER *EVP_aes_128_ecb(void); const EVP_CIPHER *EVP_aes_128_cbc(void); 下面这几个函数查询cipher的属性信息: int EVP_CIPHER_nid(const EVP_CIPHER *cipher); int EVP_CIPHER_type(const EVP_CIPHER *ctx); # define EVP_CIPHER_name(e) OBJ_nid2sn(EVP_CIPHER_nid(e)) int EVP_CIPHER_block_size(const EVP_CIPHER *cipher); int EVP_CIPHER_key_length(const EVP_CIPHER *cipher); int EVP_CIPHER_iv_length(const EVP_CIPHER *cipher); 有时我们对使用的加密算法不熟悉,这几个函数很有帮助。 EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void); void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *c); 这两个函数用于创建和释放对称加解密上下文对象。 int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *x, int keylen); 当对称算法密钥长度为可变长时,设置对称算法的密钥长度。 成功返回1,失败返回0。 int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *c, int pad); 设置对称算法的填充,对称算法有时候会涉及填充。 pad取值0和1,当pad为1时表示使用填充。默认的填充策略采用PKCS5规范,即最后一个分组被填充n个字节时,其填充值均为n。 成功返回1,失败返回0。 int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, const unsigned char *key, const unsigned char *iv); 初使化对称加密上下文。 成功返加1,失败返回0。 int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, const unsigned char *in, int inl); 加密一段明文。 成功返加1,失败返回0。成功时,outl输出密文长度。 int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); 加密余下的明文。 成功返加1,失败返回0。成功时,outl输出密文长度。 int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, const unsigned char *key, const unsigned char *iv); 初使化对称解密上下文。 成功返加1,失败返回0。 int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, const unsigned char *in, int inl); 解密一段密文。 成功返加1,失败返回0。成功时,outl输出明文长度。 int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); 解密余下的密文。 成功返加1,失败返回0。成功时,outl输出明文长度。 int EVP_BytesToKey(const EVP_CIPHER *type, const EVP_MD *md, const unsigned char *salt, const unsigned char *data, int datal, int count, unsigned char *key, unsigned char *iv); 计算密钥函数,它根据算法类型、摘要算法、salt以及输入数据计算出一个对称密钥和初始化向量iv。返加密钥的长度。 在PEM_do_header()函数中根据口令生成密钥时,有使用到这个函数。 这个结构定义了非对称密钥信息的存储容器。主要字段含义: type —— 非对称加密算法的NID。 save_type —— 保存的PKEY类型。 pkey —— 保存的PKEY指针,如RSA结构指针。 EVP_PKEY *EVP_PKEY_new(void); void EVP_PKEY_free(EVP_PKEY *pkey); 这两个函数用于创建和释放PKEY上下文对象。 int EVP_PKEY_assign(EVP_PKEY *pkey, int type, void *key); 为PKEY关联指定算法类型的上下文结构,如为RSA关联的宏定义如下: # define EVP_SignInit(a,b) EVP_DigestInit(a,b) # define EVP_SignUpdate(a,b,c) EVP_DigestUpdate(a,b,c) int EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s, EVP_PKEY *pkey); 签名计算。从宏定义可以看出实际上就是先计算摘要,再用RSA私钥加密。 成功返加1,失败返回0。 # define EVP_VerifyInit(a,b) EVP_DigestInit(a,b) # define EVP_VerifyUpdate(a,b,c) EVP_DigestUpdate(a,b,c) int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, unsigned int siglen, EVP_PKEY *pkey); 验签计算。从宏定义可以看出实际上就是先计算摘要,再用RSA公钥解密签名,再与摘要进行比对。 成功返加1,失败返回0。 下面这个例子演示了使用MD5的两种方法进行摘要计算的过程。 输出: EVP_DigestInit() ret:[1] EVP_DigestUpdate() ret:[1] EVP_DigestFinal() ret:[1] e380e88e8d09ebf8d8659a15b0ea70b5 EVP_Digest() ret:1 e380e88e8d09ebf8d8659a15b0ea70b5 下面这个例子演示了使用DES进行加解密的过程。为了方便程序实现,破例使用了std::string。 输出: EVP_EncryptInit() ret:[1] EVP_EncryptUpdate() ret:[1] nCipherLen:[24] EVP_EncryptFinal() ret:[1] nCipherLen:[8] cipher size:[32] EVP_DecryptInit() ret:[1] EVP_DecryptUpdate() ret:[1] nTextLen:[24] EVP_DecryptFinal() ret:[1] nTextLen:[2] text size:[26] body:[abcdefghijklmnopqrstuvwxyz] 下面这个例子演示了使用SHA1进行RSA签名和验签计算的过程。 输出: RSA_generate_key_ex() ret:[1] EVP_PKEY_assign_RSA() ret:[1] EVP_SignInit() ret:[1] EVP_SignUpdate() ret:[1] EVP_SignFinal() ret:[1] sha1 len:[64] EVP_VerifyInit() ret:[1] EVP_VerifyUpdate() ret:[1] EVP_VerifyFinal() ret:[1]2023-08-06 13:26:161
openssl不是内部或外部命令,也不是可运行的程序和批处理文件.该怎么解决?
是程序处理文件出现错误。解决方法:1、单击选择下【属性】。2、接着鼠标点下界面里的【高级系统设置】,如图。3、接着鼠标立即选择下【环境变量】,如图。4、接着找到【系统变量——Path】,下方选择【编辑】。5、看到【%SystemRoot%】,点下它后右侧点【编辑】。6、接着我们在这名字后面加【;System32】就可以了。2023-08-06 13:26:245
OpenSSL之随机数用法
随机数是一种无规律的数,但是真正做到完全无规律也较困难,所以一般将它称之为伪随机数。随机数在密码学用的很多,比如SSL握手中的客户端hello和服务端hello消息中都有随机数;SSL握手中的预主密钥是随机数;RSA密钥生成也用到随机数。如果随机数有问题,会带来很大的安全隐患。软件生成随机数一般预先设置随机数种子,再生成随机数。设置随机数种子可以说是对生成随机数过程的一种扰乱,让产生的随机数更加无规律可循。生成随机数有多种方法,可以是某种算法也可以根据某种或多种随机事件来生成。比如,鼠标的位置、系统的当前时间、本进程/线程相关信息以及机器噪声等。安全性高的应用一般都采用硬件方式(随机数发生器)来生成随机数。 本文假设你已经安装好了OpenSSL,并且持有一份1.1.1的源码。 随机数相关的头文件为rand.h、源文件在crypto/rand目录中。 这个结构定义了涉及随机数生成的抽象方法集合。主要字段含义: seed —— 随机数种子函数。 bytes —— 随机数生成函数。 cleanup —— 状态清除函数。 add —— 随机数种子添加函数。 pseudorand —— 可重现的随机数函数。 status —— 状态查询函数。 在1.1.1中,大多数的数据结构已经不再向使用者开放,从封装的角度来看,这是更合理的。如果你在头文件中找不到结构定义,不妨去源码中搜一搜。 int RAND_set_rand_method(const RAND_METHOD *meth); 设置自定义的随机数抽象方法。 成功返回1,失败返回0。 const RAND_METHOD *RAND_get_rand_method(void); 获取当前的随机数抽象方法集合。 成功返回有效指针,失败返回NULL。 在我们未调用RAND_set_rand_method()的情况下,该函数返回默认的抽象方法集合。 RAND_METHOD *RAND_OpenSSL(void); 这个函数返回OpenSSL内置的随机数,通常为RAND_DRBG随机数。 void RAND_seed(const void *buf, int num); 种子函数,为了让openssl内部维护的随机数据更加无序,可使用本函数。buf为用户输入的随机数地址,num为其字节数。Openssl将用户提供的buf中的随机内容与其内部随机数据进行摘要计算,更新其内部随机数据。 void RAND_add(const void *buf, int num, double randomness); 与seed类似,也是为了让openssl内部随机数据更加无序,其中entropy(信息熵)可以看作用户本次加入的随机数的个数。从内部实现来看,RAND_seed()相当于调用RAND_add(buf, num, num),此时传递的entropy(信息熵)和缓冲区长度是一样的。至于num和randomness这两个参数如何设置,建议randomness不要超过num的长度,最好是两者相同,或者直接调用RAND_seed(),尽量避免RAND_add()的调用。 int RAND_bytes(unsigned char *buf, int num); 生成随机数,openssl根据内部维护的随机数状态来生成结果。buf用于存放生成的随机数。num为输入参数,用来指明生成随机数的字节长度。 成功返回1,失败返回0。 int RAND_status(void); 查看熵值是否达到预定值,如果达到则返回1,否则返回0。 在openssl实现的md_rand中该函数会调用RAND_poll函数来使熵值合格。如果本函数返回0,则说明此时用户不应生成随机数,需要调用seed和add函数来添加熵值。 从1.1.1版本的使用情况来看,不需要调用RAND_seed(),RAND_status()总是返回成功的,但是建议使用者从安全考虑,虽然不需要理会RAND_status(),请在调用RAND_bytes()之前,总是使用RAND_seed()先初使化随机种子。 const char *RAND_file_name(char *file, size_t num); 指定file缓冲区和num长度,生成随机的文件路径,如果num设置太小不足以容纳完整路径,则返回NULL,建议file缓冲区通常指定256字节。 int RAND_load_file(const char *file, long max_bytes); 将file指定的随机数文件中的数据读取bytes字节(如果bytes大于1024,则读取1024字节),内部调用RAND_add进行计算,生成内部随机数。 成功返回加载的字节数(0表示文件为空),失败返回-1。 int RAND_write_file(const char *file); 生成一个随机数文件,返回生成的内容大小,通常为1024字节。 这个例子演示了随机数的相关API操作。 输出: before RAND_seed() RAND_status() ret:[1] RAND_status() ret:[1] RAND_bytes() ret:[1] 04196aa58505fdeef8c5bf9ef9d22e07a3d6859c p:[0x7ffd028a9070 - /home/test/.rnd] sFile:[0x7ffd028a9070 - /home/test/.rnd] byteswrite:[1024] bytesread:[512]2023-08-06 13:27:471
MacOS下使用OpenSSL(LibreSSL)
OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。 自OpenSSL爆出“心脏失血”漏洞后,苹果已将原有的 OpenSSL 替换为 LibreSSL。 将长度不固定的消息(Message)作为输入参数,运行特定的Hash函数,生成固定长度的输出,这个输出就是Hash,也称为这个消息的消息摘要(Message Digest) 常用的单向哈希算法有: md5, sha1, sha256, sha512等。 MD5算法为128位,SHA-1为160位,SHA-256为256位。 加密的消息摘要HMAC(Keyed Hash Message Authentication Code) 上面提到的常规Hash算法,如MD5、SHA,只有一个输入参数:消息。 如果输入参数有两个,一个是消息(Message),另一个是秘钥(Key),将会生成一个加密的消息摘要HMAC。 为了增强HMAC的安全性,只要升级加密Hash算法就可以指数级地增加破解难度。例如HMAC-MD6, HMAC-SHA-3。 曾经有一次面试,面试官问到密码学、哈希函数、避免碰撞相关的问题。 由于哈希函数是将所有不定长的消息转换成定长的消息,所以消息容量一定变小了,也有有发生碰撞的可能。这时可以通过多个哈希函数交叉验证来进一步降低发生的可能性。 常用参数: -aes-128-cbc, -aes-128-cfb, -bf-cbc等。 其中密码算法:bf, cast, des, aes, rs2等。 加密模式:cbc, ecb, cfb, ofb等。 加密算法(cipher),加密模式(encryption mode),填充(padding),初始向量(IV) 上面提到的给消息加解密除了需要加密算法aes/des等之外,还需要加密模式ecb/cbc等。 对称加密通常有四种模式(ECB、CBC、CFB、OFB)2023-08-06 13:27:541
如何安装openssl 生成证书
(1)Openssl生成公私钥使用Openssl是为了生成公钥和私钥对,用于外部商户系统和xxx系统之间报文的安全性验证。如果使用者不需要生成公私钥,而是直接对报文进行处理,则参考第四部分,计算摘要及签名值。1. 安装openssl步骤直接点击exe文件。出现需要安装vs2008插件的,直接忽略。 2. 在安装过程中找到OpenSSL相应的安装目录,进入bin目录下找到openssl.exe可执行文件,点击运行。然后分别按顺序输入如下命令:a. genrsa –out private-rsa.key 1024说明:该命令是生成一个没有加密的私钥 genrsa 生成私钥文件,私钥存储在private-rsa.key中,长度为1024。out后面指定输出文件名。 private-rsa.key 为生成的私钥文件,但该文件必须经过处理得到私钥。b. req –new –x509 –key private-rsa.key –days 750 –outpublic-rsa.cer说明:根据private-rsa.key生成证书public-rsa.cer -new 表示新的请求 -509 表示输出的证书结构 750表示证书有效天数 -out public-rsa.cer -out后面表示公钥证书,用于验证数字签名,此公钥证书或者公钥需要提前发送给需要验证本单位或部门数据的接收方。c. pkcs12 –export –name test-alias –in public-rsa.cer–inkey private-rsa.key –out 99bill-rsa.pfx说明:生成PKCS12 格式Keystore 密码前后输入要一致,这个密码在用Keystore生成公私钥过程中会用到。 Public-rsa.cer, private-rsa.key是之前生成的。附1:下述代码是从99bill-rsa.pfx中获取私钥的Java版本代码。因为private-rsa.key中生成的私钥无法直接使用,必须进行一定的处理。代码有几个注意点:文件流初始化路径需要根据自己的实际路径来填写。密码是在第二节中c步骤中的密码,本实例输入的是suning。KeyStorekeyStore = KeyStore.getInstance("PKCS12");FileInputStreamfileInputStream = newFileInputStream("D:/OpenSSL/bin/99bill-rsa.pfx");char[]nPassword = "suning".toCharArray();StringkeyAlias = null;keyStore.load(fileInputStream,nPassword);fileInputStream.close();System.out.println("keystoretype=" + keyStore.getType());Enumeration<String>enumeration = keyStore.aliases();if(enumeration.hasMoreElements()){keyAlias = (String) enumeration.nextElement();System.out.println("alias=[" + keyAlias +"]");}System.out.println("iskey entry=" + keyStore.isKeyEntry(keyAlias));PrivateKeyprikey = (PrivateKey) keyStore.getKey(keyAlias, nPassword);//私钥转成字符串StringprivateStr = Base64.encodeBase64String(prikey.getEncoded()).trim();//生成公钥字符串,还可以通过cer证书生成Certificatecert = keyStore.getCertificate(keyAlias); PublicKeypubkey = cert.getPublicKey();StringpublicStr = Base64.encodeBase64String(pubKey.getEncoded()).trim();注意:1. 所用类的说明:Base64:import org.apache.commons.net.util.Base64;Certificate:import java.security.cert.Certificate;2. 在openssl生成公私钥过程中,用户输入了密码。本例中密码为suning。 1. 摘要及生成方法摘要的生成过程(digest方法全部实现了下述3个过程):1. 根据key对传来的map数据排序;2. 生成a1=b1&a2=b2&a3=b3形式的字符串,排除某些字符串Key值;3. 调用digest方法进行md5编码;以上三步均通过Digest.digest()方法实现:String digest = Digest.digest(Map<String,String> map, String... keys);传递的http报文体body内容如a1=b1&a2=b2&a3=b3形式的字符串,提取出需要加签的字符串并转成map形式。execludeKes是要排除的字段,是一个字符串数组。计算摘要这一步很关键,因为选取的字段要求发送方和接收方必须一致,即发送方对哪些字段计算摘要,那么同样地接收方也必须对相同的字段计算摘要,否则会报6601的错误。 说明:a. Map是存储了计算摘要的字段 b. keys表示排除的字段,不能用于计算摘要的字段,如signature,signAlgorithm2. 公钥证书及字符串转换方法转换的目的:便于存储。(商户直接提供公钥证书也可以,但是对于向验签系统提供公钥字符串的商户,需要用下述代码把公钥转成字符串)1. 公钥/私钥字符串转成公钥/私钥,主要是把字符串转成公钥PublicKeyX509EncodedKeySpec pubKeySpec = newX509EncodedKeySpec(Base64.decodeBase64(strPubKey)); KeyFactorykeyFactory = KeyFactory.getInstance(RSA); PublicKeypubKey = keyFactory.generatePublic(pubKeySpec);2. 公钥或私钥转成Base64字符串:StringpublicStr = Base64.encodeBase64String(pubKey.getEncoded()).trim();3. 公私钥验证方法验证目的:公私钥生成之后,需要验证是否匹配。(之前许多商户生成公私钥混乱,无法确定公私钥是否匹配就添加到验签系统中)。此代码由用户自己用junit验证运行。验证公私钥生成是否正确,如果result为true,则说明公私钥生成正确;否则生成的公私钥有问题,不能使用。String prik1 ="";String pubb ="";String data ="wkk";String digest =Digest.digest(data);PrivateKey privateKey =RSAUtil.getPrivateKey(prik1);String sign =RSAUtil.sign(digest, privateKey);boolean result =RSAUtil.vertiy(digest, sign, RSAUtil.getPublicKey(pubb));System.out.println(result);2023-08-06 13:28:011
OpenSSL的编译和使用
个人博客地址: https://blog.yookingh.cn 该文章地址: https://blog.yookingh.cn/dev/201215-openssl.html 从NDK r19开始,由于gcc兼容clang的编译方式有问题,该版本已经移除了相关gcc文件,所以用老方法交叉编译Openssl的时候,会提示找不到gcc文件。 参考: https://blog.csdn.net/zoujin6649 build-android-single.sh 脚本文件及注释如下 执行脚本 修改脚本为 循环编译 ,编译所有需要的文件 build-android-all.sh 脚本文件内容如下 执行脚本方法同上,如为第一次执行(即没有Makefile文件),仍需要执行 ./config 循环编译无需执行 make clean 参考: https://blog.csdn.net/iamadk Python 脚本内容 创建编译执行脚本 执行编译脚本同r15,第一次需要执行 ./config 生成Makefile,第二次或以上需要清除make记录即 make clean ,接下来依旧是创建 循环编译 脚本2023-08-06 13:28:091
怎么看openssl版本
1、打开openss,输入命令:yum -y install redhat-lsb。2、安装成功后执行lsb_release命令。3、直接执行lsb_release命令输出LSB Version信息,等价于lsb_release -v。4、查看发布的版本号,输入命令:lsb_release -r。5、查看版本描述信息,输入命令:lsb_release -d。6、显示所有LSB相关的信息,输入命令:lsb_release -a。7、查看lsb_release支持的所有参数,输入命令:lsb_release -h。2023-08-06 13:28:163
OpenSSL之ASN1用法
ASN.1 – Abstract Syntax Notation dot one,抽象记法1,在大部分的书写场合会简写为ASN1。它描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的应用程序。 ASN1有很多实现版本,OpenSSL主要采用DER格式。 本文假设你已经安装好了OpenSSL,并且持有一份1.1.1的源码。 ASN1相关的头文件为asn1.h、asn1t.h、源文件在crypto/asn1目录中。 这个结构负责管理ANS1大多数数据类型的内存组织方式,字段含义: length —— 管理的数据长度。 type —— 管理的数据类型。 data —— 数据指针。 flags —— 标志位,跟具体数据类型有关。 管理的数据类型: 主要数据类型的取值: 其它一些类型的定义: 在OpenSSL的实现中,每个数据类型都有一个ITEM结构,它负责定义这个数据类型的编解码规则。 相关字段含义如下: itype —— 定义ITEM自身的类型,取值: utype —— 定义管理的数据类型,取值前面有说明,例如V_ASN1_INTEGER。 templates —— 数据处理方法模板数组指针。 tcount —— 模板数组的个数。 funcs —— 回调方法指针。 size —— 负责数据结构的大小。 sname —— 指向数据结构的名称。 前面讲到,对每个数据类型来说,OpenSSL需要一个对应的ITEM结构,下面这几个宏为每个数据类型声明ITEM结构,同时也声明了相应的助记函数。如下: 拿 DECLARE_ASN1_FUNCTIONS(ASN1_INTEGER) 来说,宏定义展开形式为: 还有几个宏负责为数据类型实现相应的助记函数。如下: 拿 IMPLEMENT_ASN1_ITEM(ASN1_INTEGER) 来说,其展开形式为: 可以看到,展开形式所实现的助记函数实际上是对ASN1内部几个函数的封装调用,对提供上层数据类型与内部类型的转换,其中ASN1_VALUE是类型上下转换的纽带,它是个万能指针: typedef struct ASN1_VALUE_st ASN1_VALUE; 在asn1.h中,对基本数据类型声明了助记函数: 可是我暂时还没有找到对基本数据类型助记函数的宏实现。 OpenSSL的ASN1编码处理依赖ASN1_ITEM对象,对基本类型来说,OpenSSL本身已经做了声明和初使化,所以可以直接以相关函数中使用。然而对于自定义结构体,需要开发者来定义ASN1_ITEM对象和规则,有一些宏可以提供帮助,摘录部分如下: 在ASN1_ITEM结构中,ASN1_TEMPLATE的结构定义如下: 主要字段含义: offset —— 字段在父结构中的偏移。 field_name —— 字段名称。 item —— 指向字段对应结构类型的ASN1_ITEM对象。 举例定义如下的自定义结构: 将宏展开,为: ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it); void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it); 根据ITEM对象创建和释放对应的数据类型。 ASN1_VALUE *ASN1_item_d2i(ASN1_VALUE **val, const unsigned char **in, long len, const ASN1_ITEM *it); 根据ITEM对象将DER编码转换为二进制结构。 成功返回有效指针,成功返回NULL。 如果val为NULL,将内部分配内存,但必须由外部使用者释放。 其内部实现为: 可以看到内部做了为val传入NULL的兼容性处理。 int ASN1_item_i2d(ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it); 根据ITEM对象将二进制结构转换为DER编码。 成功返回DER编码长度,失败返回负数。 如果*out为NULL,将内部分配内存,但内存必须由外部使用者释放。若**out为NULL,将仅返回长度,这用于试探长度的场景。 其内部实现为: 可以看到内部做了为out和*out传入NULL的兼容性处理。在out传入NULL的情况下,无法接收缓冲区,只能返回长度。 void *ASN1_item_d2i_bio(const ASN1_ITEM *it, BIO *in, void *x); 根据ITEM对象将DER编码转换为二进制结构,输入的DER编码来源于BIO对象。 成功返回有效指针,成功返回NULL。 事实上,本函数是对ASN1_item_d2i()的封装调用。 其内部实现为: void *ASN1_item_d2i_fp(const ASN1_ITEM *it, FILE *in, void *x); ASN1_item_d2i_bio()的FILE版本。 ASN1_item_d2i_bio()和ASN1_item_d2i_fp() 这两个函数关于输出参数x的类型定义是不恰当的,后面讲的 ASN1_d2i_bio()和ASN1_d2i_bio() 有修复这个问题。 int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, void *x); 根据ITEM对象将二进制结构转换为DER编码,输出到BIO对象中。 成功返回DER编码长度,失败返回负数。 如果*out为NULL,将内部分配内存,但内存必须由外部使用者释放。事实上,本函数是对ASN1_item_i2d()的封装调用。 其内部实现为: int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, void *x); ASN1_item_i2d_bio()的FILE版本。 其实上,以上函数由于直接需要ASN1_ITEM做为参数,很少在程序中直接使用,而是由DECLARE_ASN1_FUNCTIONS宏声明的变体,或者下面介绍的函数代替。 void *ASN1_d2i_bio(void *(*xnew) (void), d2i_of_void *d2i, BIO *in, void **x); 从BIO对象读取DER编码数据,转换为对应的二进制结构,具体的转换依赖d2i函数指针。 成功返回有效指针,失改返回NULL。 其内部实现为: void *ASN1_d2i_fp(void *(*xnew) (void), d2i_of_void *d2i, FILE *in, void **x); ASN1_d2i_bio()的FILE版本。 int ASN1_i2d_bio(i2d_of_void *i2d, BIO *out, unsigned char *x); 将二进制结构转换为DER编码,输出到BIO中,具体的转换依赖i2d函数指针。 成功返回1,失败返回0。 其内部实现为: int ASN1_i2d_fp(i2d_of_void *i2d, FILE *out, void *x); ASN1_i2d_bio() 的FILE版本。 上面d2i_of_void 和 i2d_of_void 函数的签名为: 通常为数据类型的转换助记函数。 int ASN1_INTEGER_set(ASN1_INTEGER *a, long v); 将v值设置到a中。成功返回1,失败返回0。 long ASN1_INTEGER_get(const ASN1_INTEGER *a); 获取a中存储的整数值。失败返回-1。 int ASN1_ENUMERATED_set(ASN1_ENUMERATED *a, long v); 将v值设置到a中。成功返回1,失败返回0。 long ASN1_ENUMERATED_get(const ASN1_ENUMERATED *a); 获取a中存储的枚举值。失败返回-1。 int ASN1_STRING_set(ASN1_STRING *str, const void *data, int len); 将data和len指向的串值设置到str中。成功返回1,失败返回0。 unsigned char *ASN1_STRING_data(ASN1_STRING *x); 获取x的字符串首指针。成功返回有效指针,失败返回NULL。 int ASN1_STRING_length(const ASN1_STRING *x); 获取x的字符串长度。 int i2a_ASN1_INTEGER(BIO *bp, const ASN1_INTEGER *a); 将ASN1_INTEGER转换为ASC码,输出到bp中。成功返回1,失败返回0。 int a2i_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *bs, char *buf, int size); 将bp中的ASC码转换为ASN1_INTEGER,buf存放BIO的ASC码。成功返回1,失败返回0。 int i2a_ASN1_ENUMERATED(BIO *bp, const ASN1_ENUMERATED *a); 将ASN1_ENUMERATED转换为ASC码,输出到bp中。成功返回1,失败返回0。 int a2i_ASN1_ENUMERATED(BIO *bp, ASN1_ENUMERATED *bs, char *buf, int size); 将bp中的ASC码转换为ASN1_ENUMERATED,buf存放BIO的ASC码。成功返回1,失败返回0。 int i2a_ASN1_STRING(BIO *bp, const ASN1_STRING *a, int type); 将a中的字符串转换为ASC码输出到bp中,type不起作用。返回转换的ASC字符串长度。 int a2i_ASN1_STRING(BIO *bp, ASN1_STRING *bs, char *buf, int size); 将bp中的ASC码转换为ASN1_STRING,buf存放BIO的ASC码。成功返回1,失败返回0。 ASN1_OBJECT *ASN1_OBJECT_new(void); 分配OID对象。 void ASN1_OBJECT_free(ASN1_OBJECT *a); 释放OID对象。 OID的编码规为:第一个八位组采用公式:first_arc* 40+second_arc。如果一个数大于127,就采用多个8位表示,最高位用1表示后续还有octet,用0表示后续没有。成功返回OID编码的字节数。 int a2d_ASN1_OBJECT(unsigned char *out, int olen, const char *buf, int num); 计算由ASC字符串指定的OID的DER编码。返回编码的字节数。所果事先需要知道编码的长度来分配内存,可以设置out为NULL,olen为0,获取编码字节长度,根据该长度再去分配内存。 ASN1_OBJECT *d2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, long length); 将DER编码转换为OID对象。成功返回有效指针。 int i2d_ASN1_OBJECT(const ASN1_OBJECT *a, unsigned char **pp); 将OID对象换转为DER编码。返回DER编码的长度。 int i2a_ASN1_OBJECT(BIO *bp, const ASN1_OBJECT *a); 将DER编码转换为ASC字符串,结果输出到bp中。返回ASC字符串长度。 下面这个例子测试了很多函数的用法,请自行放开注释并测试。2023-08-06 13:29:111
OpenSSL 是什么意思,做什么用的?
分都没有,真郁闷openssl OpenSSL简介 SSL是Secure Socket Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。Netscape公司在推出第一个Web浏览器的同时,提出了SSL协议标准,目前已有3.0版本。SSL采用公开密钥技术。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。目前,利用公开密钥技术的SSL协议,已成为Internet上保密通讯的工业标准。安全套接层协议能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。SSL协议要求建立在可靠的传输层协议(TCP)之上。SSL协议的优势在于它是与应用层协议独立无关的,高层的应用层协议(例如:HTTP,FTP,TELNET等)能透明地建立于SSL协议之上。SSL协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。通过以上叙述,SSL协议提供的安全信道有以下三个特性: 1.数据的保密性 信息加密就是把明码的输入文件用加密算法转换成加密的文件以实现数据的保密。加密的过程需要用到密匙来加密数据然后再解密。没有了密钥,就无法解开加密的数据。数据加密之后,只有密匙要用一个安全的方法传送。加密过的数据可以公开地传送。 2.数据的一致性 加密也能保证数据的一致性。例如:消息验证码(MAC),能够校验用户提供的加密信息,接收者可以用MAC来校验加密数据,保证数据在传输过程中没有被篡改过。 3.安全验证 加密的另外一个用途是用来作为个人的标识,用户的密匙可以作为他的安全验证的标识。SSL是利用公开密钥的加密技术(RSA)来作为用户端与服务器端在传送机密资料时的加密通讯协定。 什么是OpenSSL 众多的密码算法、公钥基础设施标准以及SSL协议,或许这些有趣的功能会让你产生实现所有这些算法和标准的想法。果真如此,在对你表示敬佩的同时,还是忍不住提醒你:这是一个令人望而生畏的过程。这个工作不再是简单的读懂几本密码学专著和协议文档那么简单,而是要理解所有这些算法、标准和协议文档的每一个细节,并用你可能很熟悉的C语言字符一个一个去实现这些定义和过程。我们不知道你将需要多少时间来完成这项有趣而可怕的工作,但肯定不是一年两年的问题。 首先,应该感谢Eric A. Young和Tim J. Hudson,他们自1995年开始编写后来具有巨大影响的OpenSSL软件包,更令我们高兴的是,这是一个没有太多限制的开放源代码的软件包,这使得我们可以利用这个软件包做很多事情。Eric A. Young 和Tim J. Hudson是加拿大人,后来由于写OpenSSL功成名就之后就到大公司里赚大钱去了。1998年,OpenSSL项目组接管了OpenSSL的开发工作,并推出了OpenSSL的0.9.1版,到目前为止,OpenSSL的算法已经非常完善,对SSL2.0、SSL3.0以及TLS1.0都支持。 OpenSSL采用C语言作为开发语言,这使得OpenSSL具有优秀的跨平台性能,这对于广大技术人员来说是一件非常美妙的事情,可以在不同的平台使用同样熟悉的东西。OpenSSL支持Linux、Windows、BSD、Mac、VMS等平台,这使得OpenSSL具有广泛的适用性。不过,对于目前新成长起来的C++程序员,可能对于C语言的代码不是很习惯,但习惯C语言总比使用C++重新写一个跟OpenSSL相同功能的软件包轻松不少。 OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。 作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。 1.对称加密算法 OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4。这7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。其中,AES使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。事实上,DES算法里面不仅仅是常用的DES算法,还支持三个密钥和两个密钥3DES算法。 2.非对称加密算法 OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。 3.信息摘要算法 OpenSSL实现了5种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。SHA算法事实上包括了SHA和SHA1两种信息摘要算法,此外,OpenSSL还实现了DSS标准中规定的两种信息摘要算法DSS和DSS1。 4.密钥和证书管理 密钥和证书管理是PKI的一个重要组成部分,OpenSSL为之提供了丰富的功能,支持多种标准。 首先,OpenSSL实现了ASN.1的证书和密钥相关标准,提供了对证书、公钥、私钥、证书请求以及CRL等数据对象的DER、PEM和BASE64的编解码功能。OpenSSL提供了产生各种公开密钥对和对称密钥的方法、函数和应用程序,同时提供了对公钥和私钥的DER编解码功能。并实现了私钥的PKCS#12和PKCS#8的编解码功能。OpenSSL在标准中提供了对私钥的加密保护功能,使得密钥可以安全地进行存储和分发。 在此基础上,OpenSSL实现了对证书的X.509标准编解码、PKCS#12格式的编解码以及PKCS#7的编解码功能。并提供了一种文本数据库,支持证书的管理功能,包括证书密钥产生、请求产生、证书签发、吊销和验证等功能。 事实上,OpenSSL提供的CA应用程序就是一个小型的证书管理中心(CA),实现了证书签发的整个流程和证书管理的大部分机制。 5.SSL和TLS协议 OpenSSL实现了SSL协议的SSLv2和SSLv3,支持了其中绝大部分算法协议。OpenSSL也实现了TLSv1.0,TLS是SSLv3的标准化版,虽然区别不大,但毕竟有很多细节不尽相同。 虽然已经有众多的软件实现了OpenSSL的功能,但是OpenSSL里面实现的SSL协议能够让我们对SSL协议有一个更加清楚的认识,因为至少存在两点:一是OpenSSL实现的SSL协议是开放源代码的,我们可以追究SSL协议实现的每一个细节;二是OpenSSL实现的SSL协议是纯粹的SSL协议,没有跟其它协议(如HTTP)协议结合在一起,澄清了SSL协议的本来面目。 6.应用程序 OpenSSL的应用程序已经成为了OpenSSL重要的一个组成部分,其重要性恐怕是OpenSSL的开发者开始没有想到的。现在OpenSSL的应用中,很多都是基于OpenSSL的应用程序而不是其API的,如OpenCA,就是完全使用OpenSSL的应用程序实现的。OpenSSL的应用程序是基于OpenSSL的密码算法库和SSL协议库写成的,所以也是一些非常好的OpenSSL的API使用范例,读懂所有这些范例,你对OpenSSL的API使用了解就比较全面了,当然,这也是一项锻炼你的意志力的工作。 OpenSSL的应用程序提供了相对全面的功能,在相当多的人看来,OpenSSL已经为自己做好了一切,不需要再做更多的开发工作了,所以,他们也把这些应用程序成为OpenSSL的指令。OpenSSL的应用程序主要包括密钥生成、证书管理、格式转换、数据加密和签名、SSL测试以及其它辅助配置功能。 7.Engine机制 Engine机制的出现是在OpenSSL的0.9.6版的事情,开始的时候是将普通版本跟支持Engine的版本分开的,到了OpenSSL的0.9.7版,Engine机制集成到了OpenSSL的内核中,成为了OpenSSL不可缺少的一部分。 Engine机制目的是为了使OpenSSL能够透明地使用第三方提供的软件加密库或者硬件加密设备进行加密。OpenSSL的Engine机制成功地达到了这个目的,这使得OpenSSL已经不仅仅使一个加密库,而是提供了一个通用地加密接口,能够与绝大部分加密库或者加密设备协调工作。当然,要使特定加密库或加密设备更OpenSSL协调工作,需要写少量的接口代码,但是这样的工作量并不大,虽然还是需要一点密码学的知识。Engine机制的功能跟Windows提供的CSP功能目标是基本相同的。目前,OpenSSL的0.9.7版本支持的内嵌第三方加密设备有8种,包括:CryptoSwift、nCipher、Atalla、Nuron、UBSEC、Aep、SureWare以及IBM 4758 CCA的硬件加密设备。现在还出现了支持PKCS#11接口的Engine接口,支持微软CryptoAPI的接口也有人进行开发。当然,所有上述Engine接口支持不一定很全面,比如,可能支持其中一两种公开密钥算法。 8.辅助功能 BIO机制是OpenSSL提供的一种高层IO接口,该接口封装了几乎所有类型的IO接口,如内存访问、文件访问以及Socket等。这使得代码的重用性大幅度提高,OpenSSL提供API的复杂性也降低了很多。 OpenSSL对于随机数的生成和管理也提供了一整套的解决方法和支持API函数。随机数的好坏是决定一个密钥是否安全的重要前提。 OpenSSL还提供了其它的一些辅助功能,如从口令生成密钥的API,证书签发和管理中的配置文件机制等等。如果你有足够的耐心,将会在深入使用OpenSSL的过程慢慢发现很多这样的小功能,让你不断有新的惊喜。2023-08-06 13:29:334
使用openssl命令从.p12文件中提取证书和私钥。
" > openssl pkcs12 -in PATH_TO_YOUR_P12 -nocerts -out key.pem -nodes " "$> openssl rsa -in key.pem -out key.pem" .pem 是 base64 编码的,直接文本打开即可看到证书及密钥2023-08-06 13:29:481
如何使用openssl生成RSA公钥和私钥对 / 蓝讯
在Linux环境下,可安装OPENSSL工具包(以ubuntu为例,执行sudo apt-get install openssl)。 在Windows环境下,打开OPENSSL安装目录bin文件下面的openssl.exe。在Linux环境下,直接在终端中运行openssl。 1)生成RSA私钥: genrsa -out rsa_private_key.pem 1024 该命令会生成1024位的私钥,生成成功的界面如下: 如何使用openssl生成RSA公钥和私钥对 此时我们就可以在当前路径下看到rsa_private_key.pem文件了。 2)把RSA私钥转换成PKCS8格式 输入命令pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM –nocrypt,并回车 得到生成功的结果,这个结果就是PKCS8格式的私钥,如下图: 如何使用openssl生成RSA公钥和私钥对 3) 生成RSA公钥 输入命令rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem,并回车, 得到生成成功的结果,如下图: 如何使用openssl生成RSA公钥和私钥对 此时,我们可以看到一个文件名为rsa_public_key.pem的文件,打开它,可以看到-----BEGIN PUBLIC KEY-----开头, -----END PUBLIC KEY-----结尾的没有换行的字符串,这个就是公钥。2023-08-06 13:29:551
openssl 生成ssl证书 能不能用
用openssl生成的ssl证书也叫自签名ssl证书,这种证书不建议使用,因为有很多弊端:第一、被“有心者”利用。其实“有心者”指的就是黑客。自签名SSL证书你自己可以签发,那么同样别人也可以签发。黑客正好利用其随意签发性,分分钟就能伪造出一张一模一样的自签证书来安装在钓鱼网站上,让访客们分不清孰真孰假。第二、浏览器会弹出警告,易遭受攻击前面有提到自签名SSL证书是不受浏览器信任的,即使网站安装了自签名SSL证书,当用户访问时浏览器还是会持续弹出警告,让用户体验度大大降低。因它不是由CA进行验证签发的,所以CA是无法识别签名者并且不会信任它,因此私钥也形同虚设,网站的安全性会大大降低,从而给攻击者可乘之机。第三、安装容易,吊销难自签名SSL证书是没有可访问的吊销列表的,所以它不具备让浏览器实时查验证书的状态,一旦证书丢失或者被盗而无法吊销,就很有可能被用于非法用途从而让用户蒙受损失。同时,浏览器还会发出“吊销列表不可用,是否继续?”的警告,不仅降低了网页的浏览速度,还大大降低了访问者对网站的信任度。第四、超长有效期,时间越长越容易被破解自签名SSL证书的有效期特别长,短则几年,长则几十年,想签发多少年就多少年。而由受信任的CA机构签发的SSL证书有效期不会超过2年,因为时间越长,就越有可能被黑客破解。所以超长有效期是它的一个弊端。2023-08-06 13:30:213
win10怎么运行openssl
1、安装Perl(我安装在C盘,同时我的openssl也解压在C盘) 使用命令行工具,进入C:Perl64eg路径下, 执行“perl example.pl”,若显示“Hello from ActivePerl!”,则说明Perl安装成功。 2、设置环境变量 打开我的电脑->属性->高级系统设置->环境变量,找到Path系统变量,点击编辑,添加E:VS 2013VCin;C:Perl64in;c:windowssystem32,其中E:VS 2013VCin是我的VS2013的安装路径,根据情况自己修改。C:Perl64in是Perl的安装路径,根据情况自己修改。 3、用管理员身份打开Visual Studio的开发人员命令提示,并进入openssl的目录(我的放在C盘根目录) 4、执行Configure命令(配置编译参数) 5、运行msdo_ms命令 6、运行nmake -f ms tdll.mak命令进行编译生成OpenSSL动态库 此时会编译大概两分钟左右,耐心等待。 7、测试 使用命令nmake -f ms tdll.mak test,若成功,会出现结果: 8、可能使用的命令 测试OpenSSL动态库:nmake -f ms tdll.mak test 测试OpenSSL静态库:nmake -f ms t.mak test 安装OpenSSL动态库:nmake -f ms tdll.mak install 安装OpenSSL静态库:nmake -f ms t.mak install 清除上次OpenSSL动态库的编译,以便重新编译:nmake -f ms tdll.mak clean 清除上次OpenSSL静态库的编译,以便重新编译:nmake -f ms t.mak clean 9、总结(使用方法) 当建立工程需要使用到openssl库时,在包含目录中添加openssl安装目录的include目录, 在库目录中添加out32dll目录。 或者将OpenSSL下的include文件夹、lib文件、dll文件拷出,使用的时候包含进去就行了。2023-08-06 13:30:441
怎么去除开机过程中openSSL
使用VS2005下的Visual Studio 2005 Command Prompt进入控制台模式(这个模式会自动设置各种环境变量)、解压缩openssl的包,进入openssl的目录、perl configure VC-WIN32尽量在这个目录下执行该命令,否则找不到Configure文件,或者指定完整的Configure文件路径。、msdo_ms在解压目录下执行msdo_ms命令、nmake -f ms tdll.mak编译后在openssl解压目录下执行,完成编译后。输出的文件在out32dll里面,包括应用程序的可执行文件、lib文件和dll文件注意:在运行第五步时,cl编译器会抱怨说.cryptodesenc_read.c文件的read是The POSIX name for this item is deprecated(不被推荐的),建议使用_read。呵呵,我可不想将OpenSSL中的所有的read函数修改为_read。再看cl的错误代码 error C2220,于是上MSDN上查找:warning treated as error - no object file generated/WX tells the compiler to treat all warnings as errors. Since an error occurred, no object or executable file was generated.是由于设置了/WX选项,将所有的警告都作为错误对待,所以。。。于是打开OpenSSL目录下的MS目录下的ntdll.mak文件,将CFLAG的/WX选项去掉,存盘。2023-08-06 13:30:511
如何在编译OPENSSL时剔除不需要的部分
如何在Windows下编译OpenSSL (VS2010使用VC10的cl编译器)1、安装ActivePerl//初始化的时候,需要用到perl解释器2、使用VS2010下的Visual Studio 2010 Command Prompt进入控制台模式(这个模式会自动设置各种环境变量)3、解压缩openssl的包,进入openssl的目录4、perl configure VC-WIN32尽量在这个目录下执行该命令,否则找不到Configure文件,或者指定完整的Configure文件路径。5、msdo_ms.bat在解压目录下执行msdo_ms.bat命令6、nmake -f ms tdll.mak7、nmake -f ms t.mak编译后在openssl解压目录下执行,完成编译后。输出的文件在out32dll (6), out32 (7)里面,包括应用程序的可执行文件、lib文件和dll文件注意:在运行第五步时,cl编译器会抱怨说.cryptodesenc_read.c文件的read是The POSIX name for this item is deprecated(不被推荐的),建议使用_read。呵呵,我可不想将OpenSSL中的所有的read函数修改为_read。再看cl的错误代码error C2220,于是上MSDN上查找:warning treated as error - no object file generated/WX tells the compiler to treat all warnings as errors. Since an error occurred, no object or executable file was generated.是由于设置了/WX选项,将所有的警告都作为错误对待,所以。。。于是打开OpenSSL目录下的MS目录下的ntdll.mak文件,将CFLAG的/WX选项去掉,存盘。。。继续执行nmake -f ms tdll.mak=================================一、编译并安装OpenSSL1、按照标准步骤从源代码编译安装OpenSSL 在编译OpenSSL前,需要正确安装Perl,因为在编译OpenSSL时需要使用到该程序。 下载最新版本的Perl然后安装之。 下载最新版本的OpenSSL 然后将源码解压缩到某个目录(如 C:openssl-0.9.8j)中。 进入openssl源码目录。 cd c:openssl-1.0.1e 以下为参照该目录下的文件INSTALL.W32的执行过程: 运行configure: perl Configure VC-WIN32 创建Makefile文件: msdo_ms.bat 编译动态库: nmake -f ms tdll.mak 编译静态库: nmake -f ms t.mak 测试动态库: nmake -f ms tdll.mak test 测试静态库: nmake -f ms t.mak test 安装动态库: nmake -f ms tdll.mak install 安装静态库: nmake -f ms t.mak install 清除上次动态库的编译,以便重新编译: nmake -f ms tdll.mak clean 清除上次静态库的编译,以便重新编译: nmake -f ms t.mak clean2、如果嫌麻烦,不想编译,可以直接用别人做好的windows OpenSSL 安装包(我用的是0.9.8j版), 可以下载 OpenSSL for Windows,直接安装。P.S. OpenSSL for Windows 的源代码有一些数据类型和VC6的编译器不兼容,我发现的不兼容的数据类型如下:在OpenSSL安装目录的下的include/bn.h文件中,将 #define BN_ULLONG unsigned long long #define BN_ULONG unsigned long long #define BN_LONG long long 分别修改为: #define BN_ULLONG ULONGLONG #define BN_ULONG ULONGLONG #define BN_LONG LONGLONG 否则,会出现编译错误。二、使用OpenSSL 在VC中配置使用以上的函数库: 点击菜单:Tools -> Options,弹出对话框"Options",在该对话框中选择"Directories"标签。 在"Show directories for:"的"Include files"选项中新增目录"C:opensslinclude"; "Library files"选择中新增目录"C:openssllib"。 然后在需要链接OpenSSL函数库的工程中加入如下两句: #pragma comment(lib, "ssleay32.lib") #pragma comment(lib, "libeay32.lib") 其作用是将OpenSSL所需的库导入工程中。三、问题 我在链接OpenSSL的静态函数库时遇到类似以下的问题: Linking... msvcrt.lib(MSVCRT.dll) : error LNK2005: _strchr already defined in libcmtd.lib(strchr.obj) ... 这是由于OpenSSL的静态函数库使用的是了VC的多线程DLL的Release版本,而我的程序使用了多线程静态链接的Release版本。 调整OpenSSL的静态函数库使用的库函数版本即可,调整过程如下: 编辑文件 ms t.mak,将该文件第19行 "CFLAG= /MD /Ox /O2 /Ob2 /W3 /WX /Gs0 /GF /Gy /nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE /Fdout32 -DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_SEED -DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2 -DOPENSSL_NO_TLSEXT -DOPENSSL_NO_KRB5 -DOPENSSL_NO_DYNAMIC_ENGINE" 中的"/MD"修改为"/MT"。然后重新编译安装OpenSSL即可。四、附录:在VC中对C/C++ 运行时库不同版本编译指令说明 《在VC中对C/C++ 运行时库不同版本编译指令说明》一文中详细介绍了连接不同版本库的编译指令如下: C Runtime Library: /MD MSVCRT.LIB 多线程DLL的Release版本 /MDd MSVCRTD.LIB 多线程DLL的Debug版本 /MT LIBCMT.LIB 多线程静态链接的Release版本 /MTd LIBCMTD.LIB 多线程静态链接的Debug版本 /clr MSVCMRT.LIB 托管代码和非托管代码混合 /clr:pure MSVCURT.LIB 纯托管代码 C++ Standard Library: /MD MSVCPRT.LIB 多线程DLL的Release版本 /MDd MSVCPRTD.LIB 多线程DLL的Debug版本 /MT LIBCPMT.LIB 多线程静态链接的Release版本 /MTd LIBCPMTD.LIB 多线程静态链接的Debug版本===============================================一 配置编译参数 配置编译参数是进行OpenSSL编译的第一步,这一步可以确定系统的环境,使用什么编译器,默认安装路径以及其他一些选项.步骤如下:1.安装perl:下载ActivePerl-5.8.8.822-MSWin32-x86-280952.msi,然后点击msi文件进行安装!2..配置编译参数:下载openssl-1.0.1e.tar.gz,解压.vc:首先在C:Program FilesMicrosoft Visual Studio .NET 2010VC10in目录下执行vcvars32.bat,然后在解压后的openssl-1.0.1e目录,执行命令配置编译参数:perl Configure VC-WIN32 bc:在解压后的openssl-0.9.8g目录下执行:perl Configure BC-32二 生成批处理文件 在使用configure脚本配置好的编译参数后,就可以使用批处理命令来生成编译脚本.生成编译脚本根据采用编译器的不同通常使用不同的批处理文件.就目前来说,使用vc编译的时候有三种选择:do_ms,do_masm和do_nasm来创建一系列编译脚本文件,即.mak脚本.步骤如下:vc:在openssl-1.0.1e目录下,执行命令来批处理文件:do_ms,do_masm和do_nasmbc:1.下载nsm09839.zip微软汇编编译器,解压,拷贝到c:/windows目录下,修改名称为nasmw.exe;2.在openssl-1.0.1e目录下,执行命令来批处理文件:msdo_nasm三 代码编译vc:完成上面步骤后,可以看到两个关键脚本文件:nt.mak和ntdll.mak.如果我们需要编译后的OpenSSL库是支持动态DLL形式的,那么应该使用ntddll.mak文件进行编译,这样编译完成我们会得到四个与OpenSSL的API库有关文件:ssleay32.lib,libeay32.lib,ssleay32.dll和libeay32.dll.执行的编译命令形式如下:nmake -f ms tdll.mak如果不希望以动态库的形式使用OpenSSL,那么可以使用nt.mak文件进行编译.这样编译后使用OpenSSL的时候,回直接将代码链接进我们的程序里面.执行命令如下:nmake -f ms t.makbc:执行命令来完成代码编译:make -f mscb.mak四 ELSE1) 测试动态库: nmake -f ms tdll.mak test 测试静态库: nmake -f ms t.mak test 安装动态库: nmake -f ms tdll.mak install 安装静态库: nmake -f ms t.mak install 清除上次动态库的编译,以便重新编译: nmake -f ms tdll.mak clean 清除上次静态库的编译,以便重新编译: nmake -f ms t.mak clean2) 使用OpenSSL 在VC中配置使用以上的函数库: 点击菜单:Tools -> Options,弹出对话框"Options",在该对话框中选择"Directories"标签。 在"Show directories for:"的"Include files"选项中新增目录"C:opensslinclude";"Library files"选择中新增目录"C:openssllib"。 然后在需要链接OpenSSL函数库的工程中编译时加入"libeay32.lib"就可以了。2023-08-06 13:30:581
openssl-devel和openssl 是什么具体关系
openssl是能够运行起来的软件包openssl-devel包是第三方软件开发时使用的Lib包,是用于编译的时候连接的库之类的文件。2023-08-06 13:31:171
怎么查看windows下安没安装openssl
Perl和OpenSSL的安装: 安装Perl(我的安装目录为C:perleg)运行“CMD”命令,使用cd命令指向perl安装目录的eg文件,执行“perl example.pl”若显示“Hello from ActivePerl!”,则说明Perl安装成功,可以开始使用Perl的相关命令来进行OpenSSL的安装了,如下图:Note:如果你想看看原始的INSTALL文件,那么请打开OpenSSL的解压缩目录,下面有两个文件INSTALL.W32和INSTALL.W64,用记事本方式打开,你可以看到详细的关于安装的解释~~~~开始安装OpenSSL初始化VC++ 6.0 环境变量(找到vc++ 6.0的安装目录下的VC98Bin执行如下的命令):执行Configure命令(配置编译参数):运行msdo_ms命令(在使用Configure脚本配置好参数):另外两种方式 如果使用也必须保证本机安装有相应的编译器才能使用。 :msdo_masm (默认vc自带的;也可以自己下载masm并安装) :msdo_nasm (需要下载nasm)运行“nmake -f ms tdll.mak”命令进行代码编译(需将目录跳到OpenSSL目录下)如果编译成功,最后的输出都在out32dll目录下:包括可执行文件、两个dll和两个lib文件: libeay32.dll, libeay32.lib, ssleay32.dll, ssleay32.lib ;把他们放到PATH环境变量对应的一个目录里就可以了。测试使用命令“nmake -f ms tdll.mak test”若安装成功的话,显示的最后几行如下图:配置VC++6.0下的相关参数在VC++ 6.0的工具—》选项—》目录下的Include files下添加OpenSSL安装目录下的include目录;在Library files下添加out32dll目录,现在你就可以使用OpenSSL编程了。2023-08-06 13:31:351
SSL和SSH和OpenSSH,OpenSSL有什么区别
1、SSL(Secure Sockets Layer 安全套接层),它提供使用 TCP/IP 的通信应用程序间的隐私与完整性。比如你访问https://servername 就是用了ssl协议,地址栏会出现小锁,双击就能查看ssl服务器证书的详细信息。TCP端口:4432、SSH(Secure Shell 远程登陆用),安全可以和telnet比较一下,比如telnet传输用户密码是明文的,而SSH是加密的。明文的可以监听到。TCP端口223、OpenSSH是个SSH的软件,OpenSSH is the premier connectivity tool for remote login with the SSH protocol. linux/unix都用openssh软件提供SSH服务。简单来说,比如以前的Solaris系统默认不提供ssh服务,需要安装OpenSSH才行。2023-08-06 13:31:511
openssl提供 DES_ecb3_encrypt方法
一. 利用openssl命令进行BASE64编码解码(base64 encode/decode) 1. BASE64编码命令 对字符串‘abc"进行base64编码: # echo abc | openssl base64 YWJjCg== (编码结果) 如果对一个文件进行base64编码(文件名t.txt): # openssl base64 -in t.txt 2. BASE64解码命令 求base64后的字符串‘YWJjCg=="的原文: # echo YWJjCg== | openssl base64 -d abc (解码结果) 如果对一个文件进行base64解码(文件名t.base64): # openssl base64 -d -in t.base64二. 利用openssl命令进行md5/sha1摘要(digest) 1. 对字符串‘abc"进行md5摘要计算:echo abc | openssl md5 若对某文件进行md5摘要计算:openssl md5 -in t.txt 2. 对字符串‘abc"进行sha1摘要计算:echo abc | openssl sha1 若对某文件进行sha1摘要计算:openssl sha1 -in t.txt三. 利用openssl命令进行AES/DES3加密解密(AES/DES3 encrypt/decrypt) 对字符串‘abc"进行aes加密,使用密钥123,输出结果以base64编码格式给出: # echo abc | openssl aes-128-cbc -k 123 -base64 U2FsdGVkX18ynIbzARm15nG/JA2dhN4mtiotwD7jt4g= (结果) 对以上结果进行解密处理: # echo U2FsdGVkX18ynIbzARm15nG/JA2dhN4mtiotwD7jt4g= | openssl aes-128-cbc -d -k 123 -base64 abc (结果) 若要从文件里取原文(密文)进行加密(解密),只要指定 -in 参数指向文件名就可以了。 进行des3加解密,只要把命令中的aes-128-cbc换成des3就可以了。另外,站长团上有产品团购,便宜有保证2023-08-06 13:32:002
OpenSSL 什么意思?
分都没有,真郁闷openssl OpenSSL简介 SSL是Secure Socket Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。Netscape公司在推出第一个Web浏览器的同时,提出了SSL协议标准,目前已有3.0版本。SSL采用公开密钥技术。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。目前,利用公开密钥技术的SSL协议,已成为Internet上保密通讯的工业标准。安全套接层协议能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。SSL协议要求建立在可靠的传输层协议(TCP)之上。SSL协议的优势在于它是与应用层协议独立无关的,高层的应用层协议(例如:HTTP,FTP,TELNET等)能透明地建立于SSL协议之上。SSL协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。通过以上叙述,SSL协议提供的安全信道有以下三个特性: 1.数据的保密性 信息加密就是把明码的输入文件用加密算法转换成加密的文件以实现数据的保密。加密的过程需要用到密匙来加密数据然后再解密。没有了密钥,就无法解开加密的数据。数据加密之后,只有密匙要用一个安全的方法传送。加密过的数据可以公开地传送。 2.数据的一致性 加密也能保证数据的一致性。例如:消息验证码(MAC),能够校验用户提供的加密信息,接收者可以用MAC来校验加密数据,保证数据在传输过程中没有被篡改过。 3.安全验证 加密的另外一个用途是用来作为个人的标识,用户的密匙可以作为他的安全验证的标识。SSL是利用公开密钥的加密技术(RSA)来作为用户端与服务器端在传送机密资料时的加密通讯协定。 什么是OpenSSL 众多的密码算法、公钥基础设施标准以及SSL协议,或许这些有趣的功能会让你产生实现所有这些算法和标准的想法。果真如此,在对你表示敬佩的同时,还是忍不住提醒你:这是一个令人望而生畏的过程。这个工作不再是简单的读懂几本密码学专著和协议文档那么简单,而是要理解所有这些算法、标准和协议文档的每一个细节,并用你可能很熟悉的C语言字符一个一个去实现这些定义和过程。我们不知道你将需要多少时间来完成这项有趣而可怕的工作,但肯定不是一年两年的问题。 首先,应该感谢Eric A. Young和Tim J. Hudson,他们自1995年开始编写后来具有巨大影响的OpenSSL软件包,更令我们高兴的是,这是一个没有太多限制的开放源代码的软件包,这使得我们可以利用这个软件包做很多事情。Eric A. Young 和Tim J. Hudson是加拿大人,后来由于写OpenSSL功成名就之后就到大公司里赚大钱去了。1998年,OpenSSL项目组接管了OpenSSL的开发工作,并推出了OpenSSL的0.9.1版,到目前为止,OpenSSL的算法已经非常完善,对SSL2.0、SSL3.0以及TLS1.0都支持。 OpenSSL采用C语言作为开发语言,这使得OpenSSL具有优秀的跨平台性能,这对于广大技术人员来说是一件非常美妙的事情,可以在不同的平台使用同样熟悉的东西。OpenSSL支持Linux、Windows、BSD、Mac、VMS等平台,这使得OpenSSL具有广泛的适用性。不过,对于目前新成长起来的C++程序员,可能对于C语言的代码不是很习惯,但习惯C语言总比使用C++重新写一个跟OpenSSL相同功能的软件包轻松不少。 OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。 作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。 1.对称加密算法 OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4。这7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。其中,AES使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。事实上,DES算法里面不仅仅是常用的DES算法,还支持三个密钥和两个密钥3DES算法。 2.非对称加密算法 OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。 3.信息摘要算法 OpenSSL实现了5种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。SHA算法事实上包括了SHA和SHA1两种信息摘要算法,此外,OpenSSL还实现了DSS标准中规定的两种信息摘要算法DSS和DSS1。 4.密钥和证书管理 密钥和证书管理是PKI的一个重要组成部分,OpenSSL为之提供了丰富的功能,支持多种标准。 首先,OpenSSL实现了ASN.1的证书和密钥相关标准,提供了对证书、公钥、私钥、证书请求以及CRL等数据对象的DER、PEM和BASE64的编解码功能。OpenSSL提供了产生各种公开密钥对和对称密钥的方法、函数和应用程序,同时提供了对公钥和私钥的DER编解码功能。并实现了私钥的PKCS#12和PKCS#8的编解码功能。OpenSSL在标准中提供了对私钥的加密保护功能,使得密钥可以安全地进行存储和分发。 在此基础上,OpenSSL实现了对证书的X.509标准编解码、PKCS#12格式的编解码以及PKCS#7的编解码功能。并提供了一种文本数据库,支持证书的管理功能,包括证书密钥产生、请求产生、证书签发、吊销和验证等功能。 事实上,OpenSSL提供的CA应用程序就是一个小型的证书管理中心(CA),实现了证书签发的整个流程和证书管理的大部分机制。 5.SSL和TLS协议 OpenSSL实现了SSL协议的SSLv2和SSLv3,支持了其中绝大部分算法协议。OpenSSL也实现了TLSv1.0,TLS是SSLv3的标准化版,虽然区别不大,但毕竟有很多细节不尽相同。 虽然已经有众多的软件实现了OpenSSL的功能,但是OpenSSL里面实现的SSL协议能够让我们对SSL协议有一个更加清楚的认识,因为至少存在两点:一是OpenSSL实现的SSL协议是开放源代码的,我们可以追究SSL协议实现的每一个细节;二是OpenSSL实现的SSL协议是纯粹的SSL协议,没有跟其它协议(如HTTP)协议结合在一起,澄清了SSL协议的本来面目。 6.应用程序 OpenSSL的应用程序已经成为了OpenSSL重要的一个组成部分,其重要性恐怕是OpenSSL的开发者开始没有想到的。现在OpenSSL的应用中,很多都是基于OpenSSL的应用程序而不是其API的,如OpenCA,就是完全使用OpenSSL的应用程序实现的。OpenSSL的应用程序是基于OpenSSL的密码算法库和SSL协议库写成的,所以也是一些非常好的OpenSSL的API使用范例,读懂所有这些范例,你对OpenSSL的API使用了解就比较全面了,当然,这也是一项锻炼你的意志力的工作。 OpenSSL的应用程序提供了相对全面的功能,在相当多的人看来,OpenSSL已经为自己做好了一切,不需要再做更多的开发工作了,所以,他们也把这些应用程序成为OpenSSL的指令。OpenSSL的应用程序主要包括密钥生成、证书管理、格式转换、数据加密和签名、SSL测试以及其它辅助配置功能。 7.Engine机制 Engine机制的出现是在OpenSSL的0.9.6版的事情,开始的时候是将普通版本跟支持Engine的版本分开的,到了OpenSSL的0.9.7版,Engine机制集成到了OpenSSL的内核中,成为了OpenSSL不可缺少的一部分。 Engine机制目的是为了使OpenSSL能够透明地使用第三方提供的软件加密库或者硬件加密设备进行加密。OpenSSL的Engine机制成功地达到了这个目的,这使得OpenSSL已经不仅仅使一个加密库,而是提供了一个通用地加密接口,能够与绝大部分加密库或者加密设备协调工作。当然,要使特定加密库或加密设备更OpenSSL协调工作,需要写少量的接口代码,但是这样的工作量并不大,虽然还是需要一点密码学的知识。Engine机制的功能跟Windows提供的CSP功能目标是基本相同的。目前,OpenSSL的0.9.7版本支持的内嵌第三方加密设备有8种,包括:CryptoSwift、nCipher、Atalla、Nuron、UBSEC、Aep、SureWare以及IBM 4758 CCA的硬件加密设备。现在还出现了支持PKCS#11接口的Engine接口,支持微软CryptoAPI的接口也有人进行开发。当然,所有上述Engine接口支持不一定很全面,比如,可能支持其中一两种公开密钥算法。 8.辅助功能 BIO机制是OpenSSL提供的一种高层IO接口,该接口封装了几乎所有类型的IO接口,如内存访问、文件访问以及Socket等。这使得代码的重用性大幅度提高,OpenSSL提供API的复杂性也降低了很多。 OpenSSL对于随机数的生成和管理也提供了一整套的解决方法和支持API函数。随机数的好坏是决定一个密钥是否安全的重要前提。 OpenSSL还提供了其它的一些辅助功能,如从口令生成密钥的API,证书签发和管理中的配置文件机制等等。如果你有足够的耐心,将会在深入使用OpenSSL的过程慢慢发现很多这样的小功能,让你不断有新的惊喜。2023-08-06 13:32:083
openssl 生成的*.key文件,怎么读出私钥解密数据
在ubuntu上要使用openssl的话需要先进行安装,命令如下:sudo apt-get install openssl安装完成就可以使用openssl了。首先需要进入openssl的交互界面,在命令行了输入openssl即可;1)生成RSA私钥:genrsa -out rsa_private_key.pem 10242023-08-06 13:32:151
编译时缺少openssl/md5.h该怎么处理
最近需要安装openssl,需要使用openssl/md5.h这个头文件,可是使用Ubuntu的apt-get install openssl安装,没有这个文件,连urs/include/openssl都没,经过一天的查找资料都没解决,最后想到了使用源码安装openssl,最终解决了。参考 http://www.linuxidc.com/Linux/2011-10/45738.htmOpenSSL 是一款开源的 SSL 软件包,采用 SSL 的公开密钥技术,用于实现传输层的通信加密功能。OpenSSL 支持 Linux、Windows、BSD、Mac 等平台,功能强大,包含丰富的密码算法库,SSL 协议库和应用程序。一、SSL 基本常识 1.1、什么是 SSL? 安全套接层(Secure Sockets Layer,SSL), 最初由 netscape 公司设计,建立在传输层的安全通信协议,采用公开密钥体系的证书认证方式来确保客户端和 SSL 服务器之间的通信安全。1.2、SSL 认证流程 SSL 客户端在 TCP 连接建立之后,发出一个消息(包含了客户端所支持的算法列表)给服务器端,然后服务器端返回一个数据包(确定了这次通信所需算法)和 SSL 服务器端的证书(包含了公钥)给客户端。客户端随后会用收到的公钥将消息加密再传送,该加密消息只能用 SSL 服务器端私钥解密,即便中途被截取也无法获知内容。二、编译安装 OpenSSL 2.1、准备工作 系统版本:Ubuntu-10.10-Server-I386更新源:apt-get update升级软件:apt-get upgrade更新系统:apt-get dist-upgrade2.2、查看OpenSSL版本 部分 Linux 系统已默认安装了 OpenSSL 0.9.8,特别是 VPS 一般都安装了。openssl version -a2.3、安装基础编译环境apt-get install build-essential2.3、编译安装 Zlib 库(这一步我没有成功,但是也成功安装了openssl)wget http://zlib.net/zlib-1.2.5.tar.gztar -zxf zlib-1.2.5.tar.gzcd zlib-1.2.5/./configure --prefix=/usr/localmake && make install2.4、卸载旧版本 OpenSSLapt-get purge opensslrm -rf /etc/ssl #删除配置文件2.5、编译与安装 OpenSSLprefix 是安装目录,openssldir 是配置文件目录,另外建议安装两次,shared 作用是生成动态连接库。wget ftp://ftp.openssl.org/source/openssl-1.0.0c.tar.gztar -zxf openssl-1.0.0c.tar.gzcd openssl-1.0.0c/./config --prefix=/usr/local --openssldir=/usr/local/sslmake && make install./config shared --prefix=/usr/local --openssldir=/usr/local/sslmake cleanmake && make进一步的配置可参考《OpenSSL-0.9.8g 安装与配置指南》http://www.linuxidc.com/Linux/2011-10/45737.htm2023-08-06 13:32:242
如何在openssl判断自签名证书
2. 生成Root CA私钥与证书:2.1 先生成RootCA私钥--》使用私钥生成CSR--》生成自签名根证书。用来给二级CA证书签名。3. 生成二级CA 私钥与证书:(假如有两个二级CA, 分别负责管理服务器端和客户端证书)3.1 先生成ServerCA私钥--》使用私钥生成CSR--》使用根证书签名生成二级证书。用来给服务器证书签名。3.2 先生成ClientCA私钥--》使用私钥生成CSR--》使用根证书签名生成二级证书。用来给客户端证书签名。4. 生成服务器端与客户端的私钥与证书:4.1 先生成ServerA私钥--》使用私钥生成CSR--》使用ServerCA证书签名生成三级证书。4.2 先生成ClientA私钥--》使用私钥生成CSR--》使用ClientCA证书签名生成三级证书。4.3 先生成ClientB私钥--》使用私钥生成CSR--》使用ClientCA证书签名生成三级证书。。。。可以生成N个客户端证书证书结构:RootCA||-------ServerCA| || |--------ServerA||-------ClientCA||--------ClientA||--------ClientB||--------...|5. 导出RootCA的根证书、服务器端和客户端的私钥和证书。导出时都使用pem格式。RootCA.pem-------根证书(PEM )ServerA.pem------服务器端证书(PEM with Certificate chain)ClientA.pem------客户端证书(PEM with Certificate chain)ClientB.pem------客户端证书(PEM with Certificate chain)ServerAKey.pem------服务器端私钥(PEM )ClientAKey.pem------客户端私钥(PEM )ClientBKey.pem------客户端私钥(PEM )6.下面是最重要的一步:生成需要使用的JKS文件。keytool工具不能导入私钥,需要利用到weblogic 提供的一个工具,需要把weblogic.jar加到CLASSPATH。6.1 生成服务器和客户端的信任证书库:keytool -import -alias rootca -file RootCA.pem -keystore trust.jks6.2 生成服务器端身份密钥库:java utils.ImportPrivateKey -keystore servera.jks -storepass 123456 -storetype JKS -keypass 123456 -alias servera -certfile ServerA.pem -keyfile ServerAKey.pem6.3 生成客户端身份密钥库:java utils.ImportPrivateKey -keystore clienta.jks -storepass 123456 -storetype JKS -keypass 123456 -alias clienta -certfile ClientA.pem -keyfile ClientAKey.pem ...生成其他客户端身份密钥库7. keytool -list -v -keystore clienta.jks (servera.jks) 可以查看其中的证书链关系。2023-08-06 13:32:311
Linux下编译安装openssl1.0.1d时遇到问题怎么办?
1、读一下INSTALL文档x0dx0a2、make clean清理一下x0dx0a3、重新来一次x0dx0a./config --prefix=/usr/local --openssldir=/usr/local/opensslx0dx0amake;make test;make install2023-08-06 13:32:381
linux下怎么开启openssl
如果装了openssl package,就会有openssl命令man openssl看说明或者自己编程2023-08-06 13:32:451
如何使用OpenSSL创建证书
(1)Openssl生成公私钥使用Openssl是为了生成公钥和私钥对,用于外部商户系统和xxx系统之间报文的安全性验证。如果使用者不需要生成公私钥,而是直接对报文进行处理,则参考第四部分,计算摘要及签名值。1. 安装openssl步骤直接点击exe文件。出现需要安装vs2008插件的,直接忽略。2. 在安装过程中找到OpenSSL相应的安装目录,进入bin目录下找到openssl.exe可执行文件,点击运行。然后分别按顺序输入如下命令:a. genrsa –out private-rsa.key 1024说明:该命令是生成一个没有加密的私钥genrsa 生成私钥文件,私钥存储在private-rsa.key中,长度为1024。out后面指定输出文件名。private-rsa.key 为生成的私钥文件,但该文件必须经过处理得到私钥。b. req –new –x509 –key private-rsa.key –days 750 –outpublic-rsa.cer说明:根据private-rsa.key生成证书public-rsa.cer-new 表示新的请求-509 表示输出的证书结构750表示证书有效天数-out public-rsa.cer -out后面表示公钥证书,用于验证数字签名,此公钥证书或者公钥需要提前发送给需要验证本单位或部门数据的接收方。c. pkcs12 –export –name test-alias –in public-rsa.cer–inkey private-rsa.key –out 99bill-rsa.pfx说明:生成PKCS12 格式Keystore密码前后输入要一致,这个密码在用Keystore生成公私钥过程中会用到。Public-rsa.cer, private-rsa.key是之前生成的。附1:下述代码是从99bill-rsa.pfx中获取私钥的Java版本代码。因为private-rsa.key中生成的私钥无法直接使用,必须进行一定的处理。代码有几个注意点:文件流初始化路径需要根据自己的实际路径来填写。密码是在第二节中c步骤中的密码,本实例输入的是suning。KeyStorekeyStore = KeyStore.getInstance("PKCS12");FileInputStreamfileInputStream = newFileInputStream("D:/OpenSSL/bin/99bill-rsa.pfx");char[]nPassword = "suning".toCharArray();StringkeyAlias = null;keyStore.load(fileInputStream,nPassword);fileInputStream.close();System.out.println("keystoretype=" + keyStore.getType());Enumeration<String>enumeration = keyStore.aliases();if(enumeration.hasMoreElements()){keyAlias = (String) enumeration.nextElement();System.out.println("alias=[" + keyAlias +"]");}System.out.println("iskey entry=" + keyStore.isKeyEntry(keyAlias));PrivateKeyprikey = (PrivateKey) keyStore.getKey(keyAlias, nPassword);//私钥转成字符串StringprivateStr = Base64.encodeBase64String(prikey.getEncoded()).trim();//生成公钥字符串,还可以通过cer证书生成Certificatecert = keyStore.getCertificate(keyAlias); PublicKeypubkey = cert.getPublicKey();StringpublicStr = Base64.encodeBase64String(pubKey.getEncoded()).trim();注意:1. 所用类的说明:Base64:import org.apache.commons.net.util.Base64;Certificate:import java.security.cert.Certificate;2. 在openssl生成公私钥过程中,用户输入了密码。本例中密码为suning。1. 摘要及生成方法摘要的生成过程(digest方法全部实现了下述3个过程):1. 根据key对传来的map数据排序;2. 生成a1=b1&a2=b2&a3=b3形式的字符串,排除某些字符串Key值;3. 调用digest方法进行md5编码;以上三步均通过Digest.digest()方法实现:String digest = Digest.digest(Map<String,String> map, String... keys);传递的http报文体body内容如a1=b1&a2=b2&a3=b3形式的字符串,提取出需要加签的字符串并转成map形式。execludeKes是要排除的字段,是一个字符串数组。计算摘要这一步很关键,因为选取的字段要求发送方和接收方必须一致,即发送方对哪些字段计算摘要,那么同样地接收方也必须对相同的字段计算摘要,否则会报6601的错误。说明:a. Map是存储了计算摘要的字段b. keys表示排除的字段,不能用于计算摘要的字段,如signature,signAlgorithm2. 公钥证书及字符串转换方法转换的目的:便于存储。(商户直接提供公钥证书也可以,但是对于向验签系统提供公钥字符串的商户,需要用下述代码把公钥转成字符串)1. 公钥/私钥字符串转成公钥/私钥,主要是把字符串转成公钥PublicKeyX509EncodedKeySpec pubKeySpec = newX509EncodedKeySpec(Base64.decodeBase64(strPubKey));KeyFactorykeyFactory = KeyFactory.getInstance(RSA);PublicKeypubKey = keyFactory.generatePublic(pubKeySpec);2. 公钥或私钥转成Base64字符串:StringpublicStr = Base64.encodeBase64String(pubKey.getEncoded()).trim();3. 公私钥验证方法验证目的:公私钥生成之后,需要验证是否匹配。(之前许多商户生成公私钥混乱,无法确定公私钥是否匹配就添加到验签系统中)。此代码由用户自己用junit验证运行。验证公私钥生成是否正确,如果result为true,则说明公私钥生成正确;否则生成的公私钥有问题,不能使用。String prik1 ="";String pubb ="";String data ="wkk";String digest =Digest.digest(data);PrivateKey privateKey =RSAUtil.getPrivateKey(prik1);String sign =RSAUtil.sign(digest, privateKey);boolean result =RSAUtil.vertiy(digest, sign,RSAUtil.getPublicKey(pubb));System.out.println(result);2023-08-06 13:33:181
php如何安装openssl扩展
php安装openssl扩展的方法:首先在PHP安装包中找到curl扩展目录;然后将config0.m4文件重命名;接着运行phpize;最后编译安装,并设置PHP配置文件php.ini即可。推荐:《PHP视频教程》 关于opensslOpenSSL是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。安装openssl扩展linux系统篇1.CentOS系统php安装包目录:/data/php5.6.14/PHP安装路径:/usr/local/php/(下面步骤中的具体路径设置,大家根据自己的实际情况设置即可。)在PHP安装包中找到curl扩展目录cd /data/php5.6.14/ext/openssl/config0.m4文件重命名mv config0.m4 config.m4运行phpize/usr/local/php/bin/phpize编译安装:./configure --with-openssl --with-php-config=/usr/local/php/bin/php-configmake && make install这时候openssl.so就已经在/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/目录下生成了设置PHP配置文件php.ini,添加下面一行extension=openssl.so最后重启服务,使用phpinfo()查看PHP-openssl扩展是否安装成功。2.Ubuntu系统执行下面命令:sudo apt-get install opensslsudo apt-get install libcurl4-openssl-devsudo apt-get install libssl-dev最后重启服务即可。Windows系统篇1: 首先检查php.ini中;extension=php_openssl.dll是否存在, 如果存在的话去掉前面的注释符‘;", 如果不存在这行,那么添加extension=php_openssl.dll。2: 讲php文件夹下的: php_openssl.dll, ssleay32.dll, libeay32.dll 3个文件拷贝到 WINDOWSsystem32 文件夹下。注意:如果没有 php_openssl.dll ,去网上下载一个,下载下来有很多个php_openssl,找到你相应php版本下面的php_openssl。3: 重启服务即可2023-08-06 13:33:251
openssl 证书 及ssh密匙
公钥和私钥都可以用来加密数据,相反用另一个解开。 公钥加密数据,然后私钥解密的情况被称为 加密解密。 私钥加密数据,公钥解密一般被称为 签名和验证签名。 RSA/DSA 一般的公钥不会用明文传输给别人的,正常情况下都会生成一个文件,这个文件就是公钥文件,然后这个文件可以交给其他人用于加密,但是传输过程中如果有人恶意破坏,将你的公钥换成了他的公钥,然后得到公钥的一方加密数据,不是他就可以用他自己的密钥解密看到数据了吗,为了解决这个问题,需要一个公证方来做这个事,任何人都可以找它来确认公钥是谁发的.这就是CA,CA确认公钥的原理也很简单,它将它自己的公钥发布给所有人,然后一个想要发布自己公钥的人可以将自己的公钥和一些身份信息发给CA,CA用自己的密钥进行加密,这里也可以称为签名.然后这个包含了你的公钥和你的信息的文件就可以称为证书文件了.这样一来所有得到一些公钥文件的人,通过CA的公钥解密了文件,如果正常解密那么机密后里面的信息一定是真的,因为加密方只可能是CA,其他人没它的密钥啊.这样你解开公钥文件,看看里面的信息就知道这个是不是那个你需要用来加密的公钥了. 密钥文件的格式用OpenSSL生成的就只有PEM和DER两种格式, PEM的是将密钥用base64编码表示出来的,直接打开你能看到一串的英文字母 DER格式是二进制的密钥文件 参考: 网址 不区分环境,使用以下命令生成新的ssh key: 选择生成文件以及key密码之后,会生成两个文件,其中已 pub 为后缀的为共钥 SSH默认位置为: Windows命令提示符: Windows / GNU / Linux / macOS / PowerShell上的Git Bash: 参考: gitlab.com2023-08-06 13:33:311
如何把openssl生成rsa加密的私钥显现可读
首先需要进入openssl的交互界面,在命令行了输入openssl即可;1)生成RSA私钥:genrsa -out rsa_private_key.pem 1024该命令会生成1024位的私钥,生成成功的界面如下:此时我们就可以在当前路径下看到rsa_private_key.pem文件了。2)把RSA私钥转换成PKCS8格式输入命令pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM –nocrypt,并回车得到生成功的结果,这个结果就是PKCS8格式的私钥,如下图:3) 生成SA公钥输入命令rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem,并回车,得到生成成功的结果,如下图:此时,我们可以看到一个文件名为rsa_public_key.pem的文件,打开它,可以看到-----BEGIN PUBLIC KEY-----开头,-----END PUBLIC KEY-----结尾的没有换行的字符串,这个就是公用2023-08-06 13:33:411
openssl 中 engine 怎样实现
为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。1.对称加密算法OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4。这7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。其中,AES使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。事实上,DES算法里面不仅仅是常用的DES算法,还支持三个密钥和两个密钥3DES算法。2.非对称加密算法OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。3.信息摘要算法OpenSSL实现了5种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。SHA算法事实上包括了SHA和SHA1两种信息摘要算法,此外,OpenSSL还实现了DSS标准中规定的两种信息摘要算法DSS和DSS1。4.密钥和证书管理密钥和证书管理是PKI的一个重要组成部分,OpenSSL为之提供了丰富的功能,支持多种标准。首先,OpenSSL实现了ASN.1的证书和密钥相关标准,提供了对证书、公钥、私钥、证书请求以及CRL等数据对象的DER、PEM和BASE64的编解码功能。OpenSSL提供了产生各种公开密钥对和对称密钥的方法、函数和应用程序,同时提供了对公钥和私钥的DER编解码功能。并实现了私钥的PKCS#12和PKCS#8的编解码功能。OpenSSL在标准中提供了对私钥的加密保护功能,使得密钥可以安全地进行存储和分发。在此基础上,OpenSSL实现了对证书的X.509标准编解码、PKCS#12格式的编解码以及PKCS#7的编解码功能。并提供了一种文本数据库,支持证书的管理功能,包括证书密钥产生、请求产生、证书签发、吊销和验证等功能。事实上,OpenSSL提供的CA应用程序就是一个小型的证书管理中心(CA),实现了证书签发的整个流程和证书管理的大部分机制。5.SSL和TLS协议OpenSSL实现了SSL协议的SSLv2和SSLv3,支持了其中绝大部分算法协议。OpenSSL也实现了TLSv1.0,TLS是SSLv3的标准化版,虽然区别不大,但毕竟有很多细节不尽相同。虽然已经有众多的软件实现了OpenSSL的功能,但是OpenSSL里面实现的SSL协议能够让我们对SSL协议有一个更加清楚的认识,因为至少存在两点:一是OpenSSL实现的SSL协议是开放源代码的,我们可以追究SSL协议实现的每一个细节;二是OpenSSL实现的SSL协议是纯粹的SSL协议,没有跟其它协议(如HTTP)协议结合在一起,澄清了SSL协议的本来面目。2023-08-06 13:33:501
如何使用OPENSSL中的AES算法加密文件
使用VS2005下的Visual Studio 2005 Command Prompt进入控制台模式(这个模式会自动设置各种环境变量)、解压缩openssl的包,进入openssl的目录、perl configure VC-WIN32尽量在这个目录下执行该命令,否则找不到Configure文件,或者指定完整的Configure文件路径。、msdo_ms在解压目录下执行msdo_ms命令、nmake -f ms tdll.mak编译后在openssl解压目录下执行,完成编译后。输出的文件在out32dll里面,包括应用程序的可执行文件、lib文件和dll文件注意:在运行第五步时,cl编译器会抱怨说.cryptodesenc_read.c文件的read是The POSIX name for this item is deprecated(不被推荐的),建议使用_read。呵呵,我可不想将OpenSSL中的所有的read函数修改为_read。再看cl的错误代码 error C2220,于是上MSDN上查找:warning treated as error - no object file generated/WX tells the compiler to treat all warnings as errors. Since an error occurred, no object or executable file was generated.是由于设置了/WX选项,将所有的警告都作为错误对待,所以。。。于是打开OpenSSL目录下的MS目录下的ntdll.mak文件,将CFLAG的/WX选项去掉,存盘。2023-08-06 13:33:571
求问怎么编译OpenSSL,得到libssl.a 和libcrypto.a,跪求
如何在Windows下编译OpenSSL (VS2010使用VC10的cl编译器)1、安装ActivePerl//初始化的时候,需要用到perl解释器2、使用VS2010下的Visual Studio 2010 Command Prompt进入控制台模式(这个模式会自动设置各种环境变量)3、解压缩openssl的包,进入openssl的目录4、perl configure VC-WIN32尽量在这个目录下执行该命令,否则找不到Configure文件,或者指定完整的Configure文件路径。5、msdo_ms.bat在解压目录下执行msdo_ms.bat命令6、nmake -f ms tdll.mak7、nmake -f ms t.mak编译后在openssl解压目录下执行,完成编译后。输出的文件在out32dll (6), out32 (7)里面,包括应用程序的可执行文件、lib文件和dll文件注意:在运行第五步时,cl编译器会抱怨说.cryptodesenc_read.c文件的read是The POSIX name for this item is deprecated(不被推荐的),建议使用_read。呵呵,我可不想将OpenSSL中的所有的read函数修改为_read。再看cl的错误代码error C2220,于是上MSDN上查找:warning treated as error - no object file generated/WX tells the compiler to treat all warnings as errors. Since an error occurred, no object or executable file was generated.是由于设置了/WX选项,将所有的警告都作为错误对待,所以。。。于是打开OpenSSL目录下的MS目录下的ntdll.mak文件,将CFLAG的/WX选项去掉,存盘。。。继续执行nmake -f ms tdll.mak=================================一、编译并安装OpenSSL1、按照标准步骤从源代码编译安装OpenSSL 在编译OpenSSL前,需要正确安装Perl,因为在编译OpenSSL时需要使用到该程序。 下载最新版本的Perl然后安装之。 下载最新版本的OpenSSL 然后将源码解压缩到某个目录(如 C:openssl-0.9.8j)中。 进入openssl源码目录。 cd c:openssl-1.0.1e 以下为参照该目录下的文件INSTALL.W32的执行过程: 运行configure: perl Configure VC-WIN32 创建Makefile文件: msdo_ms.bat 编译动态库: nmake -f ms tdll.mak 编译静态库: nmake -f ms t.mak 测试动态库: nmake -f ms tdll.mak test 测试静态库: nmake -f ms t.mak test 安装动态库: nmake -f ms tdll.mak install 安装静态库: nmake -f ms t.mak install 清除上次动态库的编译,以便重新编译: nmake -f ms tdll.mak clean 清除上次静态库的编译,以便重新编译: nmake -f ms t.mak clean2、如果嫌麻烦,不想编译,可以直接用别人做好的windows OpenSSL 安装包(我用的是0.9.8j版), 可以下载 OpenSSL for Windows,直接安装。P.S. OpenSSL for Windows 的源代码有一些数据类型和VC6的编译器不兼容,我发现的不兼容的数据类型如下:在OpenSSL安装目录的下的include/bn.h文件中,将 #define BN_ULLONG unsigned long long #define BN_ULONG unsigned long long #define BN_LONG long long 分别修改为: #define BN_ULLONG ULONGLONG #define BN_ULONG ULONGLONG #define BN_LONG LONGLONG 否则,会出现编译错误。二、使用OpenSSL 在VC中配置使用以上的函数库: 点击菜单:Tools -> Options,弹出对话框"Options",在该对话框中选择"Directories"标签。 在"Show directories for:"的"Include files"选项中新增目录"C:opensslinclude"; "Library files"选择中新增目录"C:openssllib"。 然后在需要链接OpenSSL函数库的工程中加入如下两句: #pragma comment(lib, "ssleay32.lib") #pragma comment(lib, "libeay32.lib") 其作用是将OpenSSL所需的库导入工程中。三、问题 我在链接OpenSSL的静态函数库时遇到类似以下的问题: Linking... msvcrt.lib(MSVCRT.dll) : error LNK2005: _strchr already defined in libcmtd.lib(strchr.obj) ... 这是由于OpenSSL的静态函数库使用的是了VC的多线程DLL的Release版本,而我的程序使用了多线程静态链接的Release版本。 调整OpenSSL的静态函数库使用的库函数版本即可,调整过程如下: 编辑文件 ms t.mak,将该文件第19行 "CFLAG= /MD /Ox /O2 /Ob2 /W3 /WX /Gs0 /GF /Gy /nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE /Fdout32 -DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_SEED -DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2 -DOPENSSL_NO_TLSEXT -DOPENSSL_NO_KRB5 -DOPENSSL_NO_DYNAMIC_ENGINE" 中的"/MD"修改为"/MT"。然后重新编译安装OpenSSL即可。四、附录:在VC中对C/C++ 运行时库不同版本编译指令说明 《在VC中对C/C++ 运行时库不同版本编译指令说明》一文中详细介绍了连接不同版本库的编译指令如下: C Runtime Library: /MD MSVCRT.LIB 多线程DLL的Release版本 /MDd MSVCRTD.LIB 多线程DLL的Debug版本 /MT LIBCMT.LIB 多线程静态链接的Release版本 /MTd LIBCMTD.LIB 多线程静态链接的Debug版本 /clr MSVCMRT.LIB 托管代码和非托管代码混合 /clr:pure MSVCURT.LIB 纯托管代码 C++ Standard Library: /MD MSVCPRT.LIB 多线程DLL的Release版本 /MDd MSVCPRTD.LIB 多线程DLL的Debug版本 /MT LIBCPMT.LIB 多线程静态链接的Release版本 /MTd LIBCPMTD.LIB 多线程静态链接的Debug版本===============================================一 配置编译参数 配置编译参数是进行OpenSSL编译的第一步,这一步可以确定系统的环境,使用什么编译器,默认安装路径以及其他一些选项.步骤如下:1.安装perl:下载ActivePerl-5.8.8.822-MSWin32-x86-280952.msi,然后点击msi文件进行安装!2..配置编译参数:下载openssl-1.0.1e.tar.gz,解压.vc:首先在C:Program FilesMicrosoft Visual Studio .NET 2010VC10in目录下执行vcvars32.bat,然后在解压后的openssl-1.0.1e目录,执行命令配置编译参数:perl Configure VC-WIN32 bc:在解压后的openssl-0.9.8g目录下执行:perl Configure BC-32二 生成批处理文件 在使用configure脚本配置好的编译参数后,就可以使用批处理命令来生成编译脚本.生成编译脚本根据采用编译器的不同通常使用不同的批处理文件.就目前来说,使用vc编译的时候有三种选择:do_ms,do_masm和do_nasm来创建一系列编译脚本文件,即.mak脚本.步骤如下:vc:在openssl-1.0.1e目录下,执行命令来批处理文件:do_ms,do_masm和do_nasmbc:1.下载nsm09839.zip微软汇编编译器,解压,拷贝到c:/windows目录下,修改名称为nasmw.exe;2.在openssl-1.0.1e目录下,执行命令来批处理文件:msdo_nasm三 代码编译vc:完成上面步骤后,可以看到两个关键脚本文件:nt.mak和ntdll.mak.如果我们需要编译后的OpenSSL库是支持动态DLL形式的,那么应该使用ntddll.mak文件进行编译,这样编译完成我们会得到四个与OpenSSL的API库有关文件:ssleay32.lib,libeay32.lib,ssleay32.dll和libeay32.dll.执行的编译命令形式如下:nmake -f ms tdll.mak如果不希望以动态库的形式使用OpenSSL,那么可以使用nt.mak文件进行编译.这样编译后使用OpenSSL的时候,回直接将代码链接进我们的程序里面.执行命令如下:nmake -f ms t.makbc:执行命令来完成代码编译:make -f mscb.mak四 ELSE1) 测试动态库: nmake -f ms tdll.mak test 测试静态库: nmake -f ms t.mak test 安装动态库: nmake -f ms tdll.mak install 安装静态库: nmake -f ms t.mak install 清除上次动态库的编译,以便重新编译: nmake -f ms tdll.mak clean 清除上次静态库的编译,以便重新编译: nmake -f ms t.mak clean2) 使用OpenSSL 在VC中配置使用以上的函数库: 点击菜单:Tools -> Options,弹出对话框"Options",在该对话框中选择"Directories"标签。 在"Show directories for:"的"Include files"选项中新增目录"C:opensslinclude";"Library files"选择中新增目录"C:openssllib"。 然后在需要链接OpenSSL函数库的工程中编译时加入"libeay32.lib"就可以了。2023-08-06 13:34:041
使用openssl 创建pkcs12 keystore 为什么会出错
(1)Openssl生成公私钥使用Openssl是为了生成公钥和私钥对,用于外部商户系统和xxx系统之间报文的安全性验证。如果使用者不需要生成公私钥,而是直接对报文进行处理,则参考第四部分,计算摘要及签名值。1. 安装openssl步骤直接点击exe文件。出现需要安装vs2008插件的,直接忽略。 2. 在安装过程中找到OpenSSL相应的安装目录,进入bin目录下找到openssl.exe可执行文件,点击运行。然后分别按顺序输入如下命令:a. genrsa –out private-rsa.key 1024说明:该命令是生成一个没有加密的私钥 genrsa 生成私钥文件,私钥存储在private-rsa.key中,长度为1024。out后面指定输出文件名。 private-rsa.key 为生成的私钥文件,但该文件必须经过处理得到私钥。b. req –new –x509 –key private-rsa.key –days 750 –outpublic-rsa.cer说明:根据private-rsa.key生成证书public-rsa.cer -new 表示新的请求 -509 表示输出的证书结构 750表示证书有效天数 -out public-rsa.cer -out后面表示公钥证书,用于验证数字签名,此公钥证书或者公钥需要提前发送给需要验证本单位或部门数据的接收方。c. pkcs12 –export –name test-alias –in public-rsa.cer–inkey private-rsa.key –out 99bill-rsa.pfx说明:生成PKCS12 格式Keystore 密码前后输入要一致,这个密码在用Keystore生成公私钥过程中会用到。 Public-rsa.cer, private-rsa.key是之前生成的。附1:下述代码是从99bill-rsa.pfx中获取私钥的Java版本代码。因为private-rsa.key中生成的私钥无法直接使用,必须进行一定的处理。代码有几个注意点:文件流初始化路径需要根据自己的实际路径来填写。密码是在第二节中c步骤中的密码,本实例输入的是suning。KeyStorekeyStore = KeyStore.getInstance("PKCS12");FileInputStreamfileInputStream = newFileInputStream("D:/OpenSSL/bin/99bill-rsa.pfx");char[]nPassword = "suning".toCharArray();StringkeyAlias = null;keyStore.load(fileInputStream,nPassword);fileInputStream.close();System.out.println("keystoretype=" + keyStore.getType());Enumeration<String>enumeration = keyStore.aliases();if(enumeration.hasMoreElements()){keyAlias = (String) enumeration.nextElement();System.out.println("alias=[" + keyAlias +"]");}System.out.println("iskey entry=" + keyStore.isKeyEntry(keyAlias));PrivateKeyprikey = (PrivateKey) keyStore.getKey(keyAlias, nPassword);//私钥转成字符串StringprivateStr = Base64.encodeBase64String(prikey.getEncoded()).trim();//生成公钥字符串,还可以通过cer证书生成Certificatecert = keyStore.getCertificate(keyAlias); PublicKeypubkey = cert.getPublicKey();StringpublicStr = Base64.encodeBase64String(pubKey.getEncoded()).trim();注意:1. 所用类的说明:Base64:import org.apache.commons.net.util.Base64;Certificate:import java.security.cert.Certificate;2. 在openssl生成公私钥过程中,用户输入了密码。本例中密码为suning。 1. 摘要及生成方法摘要的生成过程(digest方法全部实现了下述3个过程):1. 根据key对传来的map数据排序;2. 生成a1=b1&a2=b2&a3=b3形式的字符串,排除某些字符串Key值;3. 调用digest方法进行md5编码;以上三步均通过Digest.digest()方法实现:String digest = Digest.digest(Map<String,String> map, String... keys);传递的http报文体body内容如a1=b1&a2=b2&a3=b3形式的字符串,提取出需要加签的字符串并转成map形式。execludeKes是要排除的字段,是一个字符串数组。计算摘要这一步很关键,因为选取的字段要求发送方和接收方必须一致,即发送方对哪些字段计算摘要,那么同样地接收方也必须对相同的字段计算摘要,否则会报6601的错误。 说明:a. Map是存储了计算摘要的字段 b. keys表示排除的字段,不能用于计算摘要的字段,如signature,signAlgorithm2. 公钥证书及字符串转换方法转换的目的:便于存储。(商户直接提供公钥证书也可以,但是对于向验签系统提供公钥字符串的商户,需要用下述代码把公钥转成字符串)1. 公钥/私钥字符串转成公钥/私钥,主要是把字符串转成公钥PublicKeyX509EncodedKeySpec pubKeySpec = newX509EncodedKeySpec(Base64.decodeBase64(strPubKey)); KeyFactorykeyFactory = KeyFactory.getInstance(RSA); PublicKeypubKey = keyFactory.generatePublic(pubKeySpec);2. 公钥或私钥转成Base64字符串:StringpublicStr = Base64.encodeBase64String(pubKey.getEncoded()).trim();3. 公私钥验证方法验证目的:公私钥生成之后,需要验证是否匹配。(之前许多商户生成公私钥混乱,无法确定公私钥是否匹配就添加到验签系统中)。此代码由用户自己用junit验证运行。验证公私钥生成是否正确,如果result为true,则说明公私钥生成正确;否则生成的公私钥有问题,不能使用。String prik1 ="";String pubb ="";String data ="wkk";String digest =Digest.digest(data);PrivateKey privateKey =RSAUtil.getPrivateKey(prik1);String sign =RSAUtil.sign(digest, privateKey);boolean result =RSAUtil.vertiy(digest, sign, RSAUtil.getPublicKey(pubb));System.out.println(result);2023-08-06 13:34:111
如何正确使用Nodejs 的 c++ module 链接到 OpenSSL
事情的起因是这样的, 因为某些原因, 最近在写 Nodejs 的 c++ module, 然后在js这边调用。 网络通信自然离不开ssl, 于是需要链接到Openssl的库。 我们本来的期望是,需要用户安装有Openssl的运行库, 然后我们的c++ module 动态链接到Openssl的so库上来运行。 起初一切看起来还不错,直到我们发现这个openssl的函数不能工作: PKCS7_sign() PKCS7_sign ( ) 我们发现: 如果我们的 c++ 模块与Openssl库动态链接的话, 编译都没问题. 但是运行会出现: PKCS7_sign 符号无法找到的错误. 如果我们的 c++ 模块与Openssl库静态链接的话, 编译也没问题, 但是运行时,调用这个函数的地方没有效果, 这个函数返回值是 0. 按照文档表示出现错误, 但是用 Openssl的函数 ERR_get_error 获取错误码也是0. 表示没有错误码. 在linux上是这样, 那在Mac上呢? 用Mac试了一下, 发现Mac没有问题. 于是,想到这可能是Nodejs的一个bug. 然后就去 Nodejs 给它报了一个bug: [https://github.com/joyent/node/issues/8026][1] 同时, google上搜索了 nodejs linking to openssl 类似的关键字. 找到这样几篇文章: https://github.com/TooTallNate/node-gyp/wiki/Linking-OpenSSL https://github.com/joyent/node/issues/3915http://serverfault.com/questions/338092/how-can-i-build-node-js-using-static-libssl-and-crypto-librarieshttps://github.com/robhawkes/node-extension/issues/1 通过搜索, 我们发现, 原来Nodejs自己也使用了Openssl 库, 推测nodejs自己的crypto模块也是使用Openssl lib实现的. 这点从Nodejs的源码中就能发现, 它包含了最新的Openssl的全部源码. 其中写上面第一篇文章: https://github.com/TooTallNate/node-gyp/wiki/Linking-to-OpenSSL 的那个帅哥是Nodejs的开发人员. 基本结论: Nodejs 自己使用了Openssl 在Nodejs 0.6之前, Nodejs是动态链接到 Openssl 库的. 而之后的版本都是静态链接的. 这时发现 Node 那边已经回复我的bug了: https://github.com/joyent/node/issues/8026 Node 解释的原因: Node 自己编译之后, 把自己没用到的符号清除, 所以我们在运行时就找不到符号了. 于是他们把这bug 修掉了. 保留了全部符号. 这导致 Node 的体积大了 400k.2023-08-06 13:34:191
如何查看windows服务器端和客户端openssl版本
一、准备工作1.windows2003添加组件添加IIS:勾选“应用程序服务器”,然后双击进入下图,勾选“IIS”和“ASP.NET”添加证书系统:勾选“证书服务”添加组件的时候要求填写的就按照操作填上就行了,然后下一步,直到完成。2.把openssl(执行版,有的叫编译后版)解压到d:下,当然哪个盘都可以。二、获取IIS证书请求架设好IIS网站后,在【目录安全性】选项卡中点击【服务器证书】按钮,【下一步】,【新建证书】,【现在准备证书请求--下一步】,输入【名称】,输入【单位】和【部门】,输入【公用名称】,选择【国家】并输入【省】和【市县】并【下一步】,【下一步】,【下一步】,【完成】,IIS的证书请求已经获取,就是C:certreq.txt。这里请牢记输入的信息。三、开始操作openssl(cmd –> d:openssl-0.9.7out32dll 下执行下面的操作,注意openssl.cnf文件,后面命令都是用它编译的)1.生成自签名根证书openssl req -x509 -newkey rsa:1024 -keyout cakey.pem -out cacert.pem -days 3650 -config d:openssl-0.9.7appsopenssl.cnf PEM pass phrase:根证书密码,当然很重要! Country Name: CN //两个字母的国家代号 State or Province Name: guang dong //省份名称 Locality Name: guang zhou //城市名称 Organization Name: sunrising //公司名称 Organizational Unit Name: home //部门名称 Common Name: besunny //你的姓名(要是生成服务器端的证书一定要输入域名或者ip地址) Email Address: Email地址2.把cakey.pem 拷贝到demoCAprivate, 把cacert.pem拷贝到out32dlldemoCAcopy cakey.pem demoCAprivate copy cacert.pem demoCA提醒:这时候,已经有cakey.pem:ca的私钥文件,cacert.pem:ca的自签名根证书,certreq.txt:IIS的证书请求文件,三个文件。3.用CA证书cacert.pem为IIS请求certreq.txt签发证书server.pem openssl ca -in certreq.txt -out server.pem -config d:openssl-0.9.7appsopenssl.cnf4.把server.pem转换成x509格式 openssl x509 -in server.pem -out server.cer提醒:这时候,你又得到了两个文件,一个是server.pem,一个是server.cer。现在把bin下的server.cer复制到c:下。5.将生成的证书server.cer导入到IIS打开IIS,在【默认网站】上单击右键【属性】,在【目录安全性】选项卡中点击【服务器证书】按钮,【下一步】,选择【处理挂起的请求并安装证书】并【下一步】,正常情况下,您已经看到了文本框中就是c:server.cer,如果不是,自己点【浏览】按钮去找并【下一步】,【下一步】,【完成】。回到【目录安全性】选项卡在【安全通信】栏目中单击【编辑】按钮,勾上【要求安全通道(SSL)】,勾上【要求128位加密】,选择【要求客户端证书】,点击【确定】按钮。6.生成客户端证书 openssl req -newkey rsa:1024 -keyout clikey.pem -out clireq.pem -days 365 -config d:openssl-0.9.7appsopenssl.cnf证书信息自己填写,有些内容要与根证书一致。7.CA签发客户端证书 openssl ca -in clireq.pem -out client.crt -config d:openssl-0.9.7appsopenssl.cnf8.将客户端证书转换为pk12格式 openssl pkcs12 -export -clcerts -in client.crt -inkey clikey.pem -out client.p12 -config d:openssl-0.9.7appsopenssl.cnf9.安装信任的根证书把cacert.pem改名为cacert.cer,双击cacert.cer文件,打开证书信息窗口,单击【安装证书】按钮,【下一步】。提醒,下面是最关键的:选择【将所有的证书放入下列存储区】,点击【浏览】按钮[url=file:///C:/Documents][/url] 选择【受信任的根证书颁发机构】,勾选【物理存储区】,选择【受信任的根证书颁发机构】,点【本地计算机】,并点击【确定】,【下一步】,【完成】,【是】,根证书安装完毕!勾选【物理存储区”,选择“受信任的根证书颁发机构”,点“本地计算机”,然后点“确定”。[url=file:///C:/Documents][/url] “clent.crt”的安装也是上面相同的步骤。10.安装客户端证书找到client.p12文件拷贝到本地计算机,然后双击,【下一步】,【下一步】,输入客户端证书的密码并【下一步】,【下一步】,【完成】,【确定】。到此,客户端的证书也已经安完毕。提醒:最好把cacert.cer文件作为受新人的根证书安装到本地。我架设的是提供给内网使用的,所以Common Name直接是内网IP,当然可以是域名,如果导入cacert.cer后,本地计算机就识别https://你的地址是可信任网站,直接由服务器就识别客户端的证书,然后就可以登陆了。如果没有导入cacert.cer根证书,会提示下面的:点“是”继续就可以了。然后还会弹出选择客户端数字证书的提示框。2023-08-06 13:34:281
求用OpenSSL做的RSA文件加密程序实例,VC++6.0的,各位大侠帮帮忙,急用呀,多谢啦
#include <openssl/rsa.h> #include <openssl/sha.h> int main() { RSA *r; int bits=1024,ret,len,flen,padding,i; unsigned long e=RSA_3; BIGNUM *bne; unsigned char*key,*p; BIO *b; unsigned charfrom[500],to[500],out[500]; bne=BN_new(); ret=BN_set_word(bne,e); r=RSA_new(); ret=RSA_generate_key_ex(r,bits,bne,NULL); if(ret!=1) { printf("RSA_generate_key_ex err! "); return -1; } /* 私钥i2d */ b=BIO_new(BIO_s_mem()); ret=i2d_RSAPrivateKey_bio(b,r); key=malloc(1024); len=BIO_read(b,key,1024); BIO_free(b); b=BIO_new_file("rsa.key","w"); ret=i2d_RSAPrivateKey_bio(b,r); BIO_free(b); /* 私钥d2i */ /* 公钥i2d */ /* 公钥d2i */ /* 私钥加密 */ flen=RSA_size(r); printf("please select private enc padding : "); printf("1.RSA_PKCS1_PADDING "); printf("3.RSA_NO_PADDING "); printf("5.RSA_X931_PADDING "); scanf("%d",&padding); if(padding==RSA_PKCS1_PADDING) flen-=11; else if(padding==RSA_X931_PADDING) flen-=2; else if(padding==RSA_NO_PADDING) flen=flen; else { printf("rsa not surport ! "); return -1; } for(i=0;i<flen;i++) memset(&from[i],i,1); len=RSA_private_encrypt(flen,from,to,r,padding); if(len<=0) { printf("RSA_private_encrypt err! "); return -1; } len=RSA_public_decrypt(len,to,out,r,padding); if(len<=0) { printf("RSA_public_decrypt err! "); return -1; } if(memcmp(from,out,flen)) { printf("err! "); return -1; } /* */ printf("please select public enc padding : "); printf("1.RSA_PKCS1_PADDING "); printf("2.RSA_SSLV23_PADDING "); printf("3.RSA_NO_PADDING "); printf("4.RSA_PKCS1_OAEP_PADDING "); scanf("%d",&padding); flen=RSA_size(r); if(padding==RSA_PKCS1_PADDING) flen-=11; else if(padding==RSA_SSLV23_PADDING) flen-=11; else if(padding==RSA_X931_PADDING) flen-=2; else if(padding==RSA_NO_PADDING) flen=flen; else if(padding==RSA_PKCS1_OAEP_PADDING) flen=flen-2 * SHA_DIGEST_LENGTH-2 ; else { printf("rsa not surport ! "); return -1; } for(i=0;i<flen;i++) memset(&from[i],i+1,1); len=RSA_public_encrypt(flen,from,to,r,padding); if(len<=0) { printf("RSA_public_encrypt err! "); return -1; } len=RSA_private_decrypt(len,to,out,r,padding); if(len<=0) { printf("RSA_private_decrypt err! "); return -1; } if(memcmp(from,out,flen)) { printf("err! "); return -1; } printf("test ok! "); RSA_free(r); return 0; }上述程序中当采用公钥RSA_SSLV23_PADDING加密,用私钥RSA_SSLV23_PADDING解密时会报错,原因是openssl源代码错误: rsa_ssl.c函数RSA_padding_check_SSLv23有: if (k == -1) /* err */ { RSAerr(RSA_F_RSA_PADDING_CHECK_SSLV23,RSA_R_SSLV3_ROLLBACK_ATTACK); return (-1); }修改为k!=-1即可。各种padding对输入数据长度的要求:私钥加密: RSA_PKCS1_PADDING RSA_size-11 RSA_NO_PADDING RSA_size-0 RSA_X931_PADDING RSA_size-2公钥加密 RSA_PKCS1_PADDING RSA_size-11 RSA_SSLV23_PADDING RSA_size-11 RSA_X931_PADDING RSA_size-2 RSA_NO_PADDING RSA_size-0 RSA_PKCS1_OAEP_PADDING RSA_size-2 * SHA_DIGEST_LENGTH-22023-08-06 13:34:461
如何编译openssl x64
使用VS2005下的Visual Studio 2005 Command Prompt进入控制台模式(这个模式会自动设置各种环境变量)、解压缩openssl的包,进入openssl的目录、perl configure VC-WIN32尽量在这个目录下执行该命令,否则找不到Configure文件,或者指定完整的Configure文件路径。、msdo_ms在解压目录下执行msdo_ms命令、nmake -f ms tdll.mak编译后在openssl解压目录下执行,完成编译后。输出的文件在out32dll里面,包括应用程序的可执行文件、lib文件和dll文件注意:在运行第五步时,cl编译器会抱怨说.cryptodesenc_read.c文件的read是The POSIX name for this item is deprecated(不被推荐的),建议使用_read。呵呵,我可不想将OpenSSL中的所有的read函数修改为_read。再看cl的错误代码 error C2220,于是上MSDN上查找:warning treated as error - no object file generated/WX tells the compiler to treat all warnings as errors. Since an error occurred, no object or executable file was generated.是由于设置了/WX选项,将所有的警告都作为错误对待,所以。。。于是打开OpenSSL目录下的MS目录下的ntdll.mak文件,将CFLAG的/WX选项去掉,存盘。2023-08-06 13:35:351
如何删除osx /usr/bin/openssl 文件
其实,并不需要删除掉系统自带的openssl,巧妙利用一下环境变量设置和homebrew的link功能即可解决好两个版本的openssl和谐共存了。1、在终端确认环境变量$PATH设置中,/usr/local/bin在/usr/bin之前,如下就是符合前置条件要求的环境变量设置;echo $PATH/usr/local/bin:<blablabla>:/usr/bin:/bin如果不是这样,可以根据终端默认shell来永久性重新设置$PATH的值,以确保满足条件1。查看当前用户的默认shell的方法echo $SHELL/bin/bash以上命令输出结果说明当前用户使用的终端shell就是bash,然后就可以修改~/.bash_profile,配置PATH的新值,例如这样:export PATH=/usr/local/bin:$PATH如果用的是zsh,则需要类似修改~/.zshrc。2、让homebrew自动链接安装的homebrew版openssl。brew link openssl如果提示创建软链接失败,则添加参数--forcebrew link openssl --force3、新打开一个终端,这时再输入openssl就会发现已经使用上最新版的openssl啦。openssl versionOpenSSL 1.0.2d 9 Jul 2015/usr/bin/openssl versionOpenSSL 0.9.8zg 14 July 20152023-08-06 13:35:491
如何使用openssl生成证书
Step 1. Create key (password protected)openssl genrsa -out prvtkey.pem 1024/2038 (with out password protected) openssl genrsa -des3 -out prvtkey.pem 1024/2048 (password protected)这个命令会生成一个1024/2048位的密钥。Step 2. Create certification requestopenssl req -new -key prvtkey.pem -out cert.csropenssl req -new -nodes -key prvtkey.pem -out cert.csr这个命令将会生成一个证书请求,当然,用到了前面生成的密钥prvtkey.pem文件这里将生成一个新的文件cert.csr,即一个证书请求文件,你可以拿着这个文件去数字证书颁发机构(即CA)申请一个数字证书。CA会给你一个新的文件cacert.pem,那才是你的数字证书。Step 3: Send certificate request to Certification Authority (CA)如果是自己做测试,那么证书的申请机构和颁发机构都是自己。就可以用下面这个命令来生成证书:openssl req -new -x509 -key prvtkey.pem -out cacert.pem -days 1095这个命令将用上面生成的密钥privkey.pem生成一个数字证书cacert.pemcacert.pem 生成过程见“OpenSSL建立自己的CA”有了privkey.pem和cacert.pem文件后就可以在自己的程序中使用了,比如做一个加密通讯的服务器-------------OpenSSL建立自己的CA(1) 环境准备首先,需要准备一个目录放置CA文件,包括颁发的证书和CRL(Certificate Revoke List)。这里我们选择目录 /var/MyCA。然后我们在/var/MyCA下建立两个目录,certs用来保存我们的CA颁发的所有的证书的副本;private用来保存CA证书的私钥匙。除了生成钥匙,在我们的CA体系中还需要创建三个文件。第一个文件用来跟踪最后一次颁发的证书的序列号,我们把它命名为serial,初始化为01。第二个文件是一个排序数据库,用来跟踪已经颁发的证书。我们把它命名为index.txt,文件内容为空。$ mkdir /var/MyCA$ cd /var/MyCA$ mkdir certs private$ chmod g-rwx,o-rwx private$ echo "01" > serial$ touch index.txt第三个文件是OpenSSL的配置文件,创建起来要棘手点。示例如下:$ touch openssl.cnf文件内容如下:[ ca ]default_ca = myca[ myca ]dir = /var/MyCAcertificate = $dir/cacert.pemdatabase = $dir/index.txtnew_certs_dir = $dir/certsprivate_key = $dir/private/cakey.pemserial = $dir/serialdefault_crl_days= 7default_days = 365default_md = md5policy = myca_policyx509_extensions = certificate_extensions[ myca_policy ]commonName = suppliedstateOrProvinceName = suppliedcountryName = suppliedemailAddress = suppliedorganizationName= suppliedorganizationalUnitName = optional[ certificate_extensions ]basicConstraints= CA:false我们需要告诉OpenSSL配置文件的路径,有两种方法可以达成目的:通过config命令选项;通过环境变量OPENSSL_CONF。这里我们选择环境变量的方式。$ OPENSSL_CONF=/var/MyCA/openssl.cnf"$ export OPENSSL_CONF(2) 生成根证书 (Root Certificate)我们需要一个证书来为自己颁发的证书签名,这个证书可从其他CA获取,或者是自签名的根证书。这里我们生成一个自签名的根证书。首先我们需要往配置文件里面添加一些信息,如下所示,节名和命令行工具的命令req一样。我们把所有必要的信息都写进配置,而不是在命令行输入,这是唯一指定X.509v3扩展的方式,也能让我们对如何创建根证书有个清晰的把握。[ req ]default_bits = 2048default_keyfile = /var/MyCA/private/cakey.pemdefault_md = md5prompt = nodistinguished_name = root_ca_distinguished_namex509_extensions = root_ca_extensions[ root_ca_distinguished_name ]commonName = My Test CAstateOrProvinceName = HZcountryName = CNemailAddress = test@cert.com organizationName = Root Certification Authority[ root_ca_extensions ]basicConstraints = CA:true万事俱备,我们可以生成根证书了。注意设置好环境变量OPENSSL_CONF。$ openssl req -x509 -newkey rsa -out cacert.pem -outform PEM -days 356注:“-days 356“控制有效期限为365天,默认为30天。验证一下我们生成的文件。$ openssl x509 -in cacert.pem -text -noout(3) 给客户颁发证书在给客户颁发证书之前,需要客户提供证书的基本信息。我们另外开启一个终端窗口,使用默认的OpenSSL配置文件(不要让之前的OPENSSL_CONF干扰我们,那个配置是专门用来生成根证书的)。命令和我们生成根证书的类似,都是req,不过需要提供一些额外的信息。如下:$ openssl req -newkey rsa:1024 -keyout testkey.pem -keyform PEM -out testreq.pem -outform PEM有两次提示要口令,第一次的口令用来加密私钥匙testkey.pem,第二次口令一般被OpenSSL忽略。结果生成两个文件:testkey.pem,私钥匙;testreq.pem,请求信息,其中包括公钥匙。我们来看看testreq.pem都有哪些信息?$ openssl req -in testreq.pem -text -noout现在,我们可以把testreq.pem提交给我们的CA生成证书了。为了方便起见,我们假定testreq.pem在//var/MyCA/private/中。$ openssl ca -in testreq.pem有三次提示,一次是问你CA的私钥匙密码,两次是确认,输出的结果就是为客户颁发的证书。可以通过batch选项取消命令提示,可通过notext选项取消证书的输出显示。此外,还可以一次给多个客户颁发证书,方法是用 infiles选项替换in选项,不过这个选项必须放在最后,因为此后的任何字符均被处理为文件名称列表。生成的证书放在certs目录,同时index.txt和serial的内容都发生了改变。publicdoubleside=10.0;//去掉static2023-08-06 13:35:571
win10怎么运行openssl
1、安装Perl(我安装在C盘,同时我的openssl也解压在C盘)使用命令行工具,进入C:Perl64eg路径下, 执行“perl example.pl”,若显示“Hello from ActivePerl!”,则说明Perl安装成功。2、设置环境变量打开我的电脑->属性->高级系统设置->环境变量,找到Path系统变量,点击编辑,添加E:VS 2013VCin;C:Perl64in;c:windowssystem32,其中E:VS 2013VCin是我的VS2013的安装路径,根据情况自己修改。C:Perl64in是Perl的安装路径,根据情况自己修改。3、用管理员身份打开Visual Studio的开发人员命令提示,并进入openssl的目录(我的放在C盘根目录)4、执行Configure命令(配置编译参数)5、运行msdo_ms命令6、运行nmake -f ms tdll.mak命令进行编译生成OpenSSL动态库此时会编译大概两分钟左右,耐心等待。7、测试使用命令nmake -f ms tdll.mak test,若成功,会出现结果:8、可能使用的命令测试OpenSSL动态库:nmake -f ms tdll.mak test测试OpenSSL静态库:nmake -f ms t.mak test安装OpenSSL动态库:nmake -f ms tdll.mak install安装OpenSSL静态库:nmake -f ms t.mak install清除上次OpenSSL动态库的编译,以便重新编译:nmake -f ms tdll.mak clean清除上次OpenSSL静态库的编译,以便重新编译:nmake -f ms t.mak clean9、总结(使用方法)当建立工程需要使用到openssl库时,在包含目录中添加openssl安装目录的include目录, 在库目录中添加out32dll目录。或者将OpenSSL下的include文件夹、lib文件、dll文件拷出,使用的时候包含进去就行了。2023-08-06 13:36:061