OPENSSL PKCS#7(验签)

  1 // TestOpensslP7Verify.cpp : 定义控制台应用程序的入口点。
  2 //
  3
  4 #include <stdio.h>
  5 #include <string.h>
  6
  7 #include <stdio.h>
  8 #include <string.h>
  9 #include <openssl/bio.h>
 10 #include <openssl/asn1.h>
 11 #include <openssl/x509.h>
 12 #include <openssl/pem.h>
 13 #include <openssl/err.h>
 14 #include "example.h"
 15
 16
 17 int verify_callback(int ok, X509_STORE_CTX *ctx);
 18
 19 BIO *bio_err=NULL;
 20 BIO *bio_out=NULL;
 21
 22
 23 int main(int argc, char* argv[])
 24 {
 25     PKCS7 *p7;
 26     PKCS7_SIGNER_INFO *si;
 27     X509_STORE_CTX cert_ctx;
 28     X509_STORE *cert_store=NULL;
 29     BIO *data,*detached=NULL,*p7bio=NULL;
 30     char buf[1024*4];
 31     char *pp;
 32     int i,printit=0;
 33     STACK_OF(PKCS7_SIGNER_INFO) *sk;
 34
 35     bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
 36     bio_out=BIO_new_fp(stdout,BIO_NOCLOSE);
 37
 38     //EVP_add_digest(EVP_md2());
 39     //EVP_add_digest(EVP_md5());
 40     //EVP_add_digest(EVP_mdc2());
 41
 42     EVP_add_digest(EVP_sha1());
 43
 44     data=BIO_new(BIO_s_file());
 45
 46     pp=NULL;
 47     while (argc > 1)
 48     {
 49         argc--;
 50         argv++;
 51         if (strcmp(argv[0],"-p") == 0)
 52         {
 53             printit=1;
 54         }
 55         else if ((strcmp(argv[0],"-d") == 0) && (argc >= 2))
 56         {
 57             detached=BIO_new(BIO_s_file());
 58             if (!BIO_read_filename(detached,argv[1]))
 59                 goto err;
 60             argc--;
 61             argv++;
 62         }
 63         else
 64         {
 65             pp=argv[0];
 66             if (!BIO_read_filename(data,argv[0]))
 67                 goto err;
 68         }
 69     }
 70
 71     if (pp == NULL)
 72         BIO_set_fp(data,stdin,BIO_NOCLOSE);
 73
 74
 75     /* Load the PKCS7 object from a file */
 76     if ((p7=PEM_read_bio_PKCS7(data,NULL,NULL,NULL)) == NULL) goto err;
 77
 78     /* This stuff is being setup for certificate verification.
 79     * When using SSL, it could be replaced with a
 80     * cert_stre=SSL_CTX_get_cert_store(ssl_ctx); */
 81     cert_store=X509_STORE_new();
 82     X509_STORE_set_default_paths(cert_store);
 83     X509_STORE_load_locations(cert_store,NULL,"../../certs");
 84     X509_STORE_set_verify_cb_func(cert_store,verify_callback);
 85
 86     ERR_clear_error();
 87
 88     /* We need to process the data */
 89     if ((PKCS7_get_detached(p7) || detached))
 90     {
 91         if (detached == NULL)
 92         {
 93             printf("no data to verify the signature on\n");
 94             exit(1);
 95         }
 96         else
 97             p7bio=PKCS7_dataInit(p7,detached);
 98     }
 99     else
100     {
101         p7bio=PKCS7_dataInit(p7,NULL);
102     }
103
104     /* We now have to ‘read‘ from p7bio to calculate digests etc. */
105     for (;;)
106     {
107         i=BIO_read(p7bio,buf,sizeof(buf));
108         /* print it? */
109         if (i <= 0) break;
110     }
111
112     /* We can now verify signatures */
113     sk=PKCS7_get_signer_info(p7);
114     if (sk == NULL)
115     {
116         printf("there are no signatures on this data\n");
117         exit(1);
118     }
119
120     /* Ok, first we need to, for each subject entry, see if we can verify */
121     for (i=0; i<sk_PKCS7_SIGNER_INFO_num(sk); i++)
122     {
123         ASN1_UTCTIME *tm;
124         char *str1,*str2;
125         int rc;
126
127         si=sk_PKCS7_SIGNER_INFO_value(sk,i);
128         rc=PKCS7_dataVerify(cert_store,&cert_ctx,p7bio,p7,si);
129         if (rc <= 0)
130             goto err;
131         printf("signer info\n");
132         if ((tm=get_signed_time(si)) != NULL)
133         {
134             BIO_printf(bio_out,"Signed time:");
135             ASN1_UTCTIME_print(bio_out,tm);
136             ASN1_UTCTIME_free(tm);
137             BIO_printf(bio_out,"\n");
138         }
139         if (get_signed_seq2string(si,&str1,&str2))
140         {
141             BIO_printf(bio_out,"String 1 is %s\n",str1);
142             BIO_printf(bio_out,"String 2 is %s\n",str2);
143         }
144
145     }
146
147     X509_STORE_free(cert_store);
148
149     printf("done\n");
150     exit(0);
151 err:
152     ERR_load_crypto_strings();
153     ERR_print_errors_fp(stderr);
154     exit(1);
155     return 0;
156 }
157
158
159 /* should be X509 * but we can just have them as char *. */
160 int verify_callback(int ok, X509_STORE_CTX *ctx)
161 {
162     char buf[256];
163     X509 *err_cert;
164     int err,depth;
165
166     err_cert=X509_STORE_CTX_get_current_cert(ctx);
167     err=    X509_STORE_CTX_get_error(ctx);
168     depth=    X509_STORE_CTX_get_error_depth(ctx);
169
170     X509_NAME_oneline(X509_get_subject_name(err_cert),buf,256);
171     BIO_printf(bio_err,"depth=%d %s\n",depth,buf);
172     if (!ok)
173     {
174         BIO_printf(bio_err,"verify error:num=%d:%s\n",err,
175             X509_verify_cert_error_string(err));
176         if (depth < 6)
177         {
178             ok=1;
179             X509_STORE_CTX_set_error(ctx,X509_V_OK);
180         }
181         else
182         {
183             ok=0;
184             X509_STORE_CTX_set_error(ctx,X509_V_ERR_CERT_CHAIN_TOO_LONG);
185         }
186     }
187     switch (ctx->error)
188     {
189     case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
190         X509_NAME_oneline(X509_get_issuer_name(ctx->current_cert),buf,256);
191         BIO_printf(bio_err,"issuer= %s\n",buf);
192         break;
193     case X509_V_ERR_CERT_NOT_YET_VALID:
194     case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
195         BIO_printf(bio_err,"notBefore=");
196         ASN1_UTCTIME_print(bio_err,X509_get_notBefore(ctx->current_cert));
197         BIO_printf(bio_err,"\n");
198         break;
199     case X509_V_ERR_CERT_HAS_EXPIRED:
200     case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
201         BIO_printf(bio_err,"notAfter=");
202         ASN1_UTCTIME_print(bio_err,X509_get_notAfter(ctx->current_cert));
203         BIO_printf(bio_err,"\n");
204         break;
205     }
206     BIO_printf(bio_err,"verify return:%d\n",ok);
207     return(ok);
208 }
时间: 2024-07-30 01:17:28

OPENSSL PKCS#7(验签)的相关文章

openssl+前端jsrsa签名+后端nodejs验签

内容如标题所示,总体分为三个部分: 一.win10下安装openssl,然后通过openssl工具生成RSA的公钥和私钥 (1)win10下安装openssl需要的工具有:VS2013,Perl,nasm,openssl源码 其中,VS2013的安装.注册和激活请自行百度,ActivePerl.nasm和openssl源码也请自行下载安装,ActivePerl好说(执行perl example.pl,若提示:Hello from ActivePerl! 则说明Perl安装成功),nasm我选的是

.net core RSA 分段加密解密,签名验签(对接java)

参考地址: https://www.cnblogs.com/stulzq/p/7757915.html https://www.cnblogs.com/stulzq/p/8260873.html https://github.com/stulzq/RSAExtensions(XC.RSAUtil) https://www.cnblogs.com/stulzq/p/12053976.html https://github.com/stulzq/RSAExtensions (RSAExtension

RSA加密、解密、签名、验签 DSA签名、验签

重要的事情说三遍,该篇文章主要是验证JAVA的RSA签名.验签的测试代码,主要代码参考 http://xw-z1985.iteye.com/blog/1837376 重要的事情说三遍,该篇文章主要是验证JAVA的RSA签名.验签的测试代码,主要代码参考 http://xw-z1985.iteye.com/blog/1837376 重要的事情说三遍,该篇文章主要是验证JAVA的RSA签名.验签的测试代码,主要代码参考 http://xw-z1985.iteye.com/blog/1837376 下

java/php/c#版rsa签名以及java验签实现

在开放平台领域,需要给isv提供sdk,签名是Sdk中需要提供的功能之一.由于isv使用的开发语言不是单一的,因此sdk需要提供多种语言的版本.譬如java.php.c#.另外,在电子商务尤其是支付领域,对安全性的要求比较高,所以会采用非对称密钥RSA 本文主要介绍如何基于java.php.c#在客户端使用rsa签名,然后在服务端使用Java验签. 基于openssl生成RSA公私钥对 a)从网上下载openssl工具:http://www.slproweb.com/products/Win32

.NET RSA解密、签名、验签

using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; namespace API.Tools { /// <summary> /// 类名:RSAFromPkcs8 /// 功能:RSA解密.签名.验签 /

java/php/c#版rsa签名以及验签实现

本文为转载,请转载请注明地址: 原文地址为        http://xw-z1985.iteye.com/blog/1837376 在开放平台领域,需要给isv提供sdk,签名是Sdk中需要提供的功能之一.由于isv使用的开发语言不是单一的,因此sdk需要提供多种语言的版 本.譬如java.php.c#.另外,在电子商务尤其是支付领域,对安全性的要求比较高,所以会采用非对称密钥RSA 本文主要介绍如何基于java.php.c#在客户端使用rsa签名,然后在服务端使用Java验签. 基于ope

RSA体系 c++/java相互进行加签验签--转

在web开发中,采用RSA公钥密钥体系自制ukey,文件证书登陆时,普遍的做法为:在浏览器端采用c++ activex控件,使用 c++的第三库openssl进行RAS加签操作,在服务器端采用java对客户端的签名进行验签操作.这就涉及到c++ openssl和java之间交互加签验签对客户端身份进行验证的过程. 如果你通过搜索查到我这边文章,相信你一定发现,采用openssl加签后的 数据,在java端却验签不成功,使用openssl验签可以通过.问题在于openssl的公钥发在服务端转换成j

ruby md5加签验签方法

# md5签名def md5_sign(data,key) return OpenSSL::Digest::MD5.hexdigest(data+key)end # md5验签def md5_verify(data,sign,key) return true if sign.eql? OpenSSL::Digest::MD5.hexdigest(data+key) return falseend

Python中rsa模块【sign 加签验签】的使用

安装 pip install rsa 使用一 说明:简单入门使用  使用公钥加密  ----------->> 使用私钥进行解密 1 # -*- coding:utf-8 -*- 2 import rsa 3 4 5 def rsa_encrypt(d_str): 6 """ 7 生成私钥 和公钥 并接受字符串进行加密 8 :param d_str: 字符串 9 :return: 返回加密结果及私钥 10 """ 11 # 生成公钥和