Tag: openssl

SSL_CTX_set_verify()回调和当前深度

我在C中为SSL_CTX_set_verify()编写自己的回调函数以执行其他证书检查(当preverify_ok参数为1 )。 但是,我只想对叶证书(depth = 0)执行检查。 有一个函数X509_STORE_CTX_get_error_depth()可以获取错误的深度; 但即使没有错误,我也想要当前的深度,所以只有当深度= 0时我才能进行额外的检查。 (注意,函数SSL_CTX_get_verify_depth()返回深度限制而不是当前深度。) 有什么办法可以做我想要的吗?

OpenSSL x509证书:使用X509_add1_ext_i2d()添加扩展名

语境: 我正在使用OpenSSL中的API生成x509证书。 我首先创建这样的X509结构: X509 *x509 = X509_new(); // Assume no errors 我想做什么: 现在我想为此证书添加扩展名。 具体来说,我想将“扩展密钥用法”扩展名设置为值serverAuth,clientAuth 。 为此,我尝试使用具有以下签名的OpenSSL函数x509_add1_ext_i2d() : X509_add1_ext_i2d(X509 *x, int nid, void *value, int crit, unsigned long flags) 我正在调用该函数传递一个C字符串的value ,我认为这是不正确的。 这是我正在制作的电话: X509_add1_ext_i2d(x509, NID_ext_key_usage, “serverAuth,clientAuth”, 0, 0) 发生了什么: 当该行代码运行时,我得到一个EXC_BAD_ACCESS (code=EXC_i386_GPFLT)exception。 我假设那是因为我传入的value必须是某种特殊的东西(一个八位字符串?某种其他的OpenSSL值?) 我需要的: 为了正确地将该扩展名设置为字符串值serverAuth,clientAuth我需要为value参数传递什么? 或者,或者,为什么我得到列出的例外? 注意:如果我删除此行并尝试生成没有扩展名的证书(其他属性,如名称,到期日期等,我为了简洁而在此处排除),它可以正常工作。 我花了一整天的时间来倾听OpenSSL(荒谬可怜)的文档和谷歌搜索。 我能找到的所有内容都讨论了如何从命令行而不是代码中添加证书扩展。 我无法追踪这个函数期望在value参数中看到的内容。

使用c进行rsa加密解密

我正在尝试使用Open SSL编写RSA加密和解密的C代码。 但我无法这样做。 我用谷歌搜索了它,但无论我从互联网上得到什么代码,它都是我的头脑。 mainfunction在这里,我从堆栈溢出。 我尝试过使用它……但它不起作用。 可能是我的坏事。 encrypt(FILE *rsa_Pkey_fole,FILE *in_file,FILE *out_file){ } int main(int argc, char *argv[]) { FILE *rsa_pkey_file, *infile; int rv; if (argc < 2) { fprintf(stderr, "Usage: %s \n”, argv[0]); exit(1); } rsa_pkey_file = fopen(argv[1], “rb”); infile = fopen(argv[2], “w”); if (!rsa_pkey_file) { perror(argv[1]); fprintf(stderr, “Error loading PEM RSA Public Key File.\n”); […]

Windows 2008R2 CA和OpenSSL CSR:解析CSR ASN1错误值时遇到错误

我正在使用OpenSSL C API来构建CSR。 代码如下: static void seedPRNG() { const int openSSLseedsize = 128; uint8_t *openSSLseed = NULL; openSSLseed = malloc(openSSLseedsize * sizeof(uint8_t)); //printf(“%d\n\n”, openSSLseedsize); // random number generator SecRandomCopyBytes(kSecRandomDefault, openSSLseedsize, openSSLseed); for (unsigned i = 0; i < openSSLseedsize; i++) { printf("%d", openSSLseed[i]); } printf("\n\n\n\n"); //seed openSSL random RAND_seed(openSSLseed, 128); } // Parameter settings for […]

无法使用Cygwin和OpenSSL计算CMAC

我想使用OpenSSL计算CMAC。 我发现这个问题对我很有帮助。 但我遇到以下代码的问题: #include void dispHex(const unsigned char *buffer, unsigned int size) { int i=0; for (i=0; i<size-1; i++) { printf("%02X ", buffer[i]); } printf("%02x\n", buffer[i]); } int main() { size_t out_len; unsigned char res[16]; unsigned char mac_key[16] = { 0x00, 0x01 ,0x02 ,0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01 ,0x02 ,0x03, 0x04, 0x05, 0x06, […]

使用引擎进行随机数生成

我正在尝试使用OpenSSL的RAND_bytes API,但我想尝试使用各种随机数生成引擎。 是否有推荐的方法在OpenSSL中生成随机字节并添加熵? 我在哪里可以获得其他Engine实现,以及如何交换它们?

使用OpenSSL生成RSA公钥/私钥?

主要的问题是我对C很新,OpenSSL文档对我来说还不够清楚,我尝试过用RS读取和写入一个pem文件的rsa键 ,但我不太明白。 例如, create_rsa_key()函数如何创建私有和公共? pCipher来自哪里? 那个pcszPassphrase什么pcszPassphrase呢? 我会解释好像它是某种伪代码,这就是我想做的事情,粗体部分是那些我不知道怎么做的部分: 生成私钥和公钥作为hex缓冲区(客户端) 安全地将公钥发送到另一个端点(客户端) 使用AES256 CBC(服务器)使用随机256位密码加密某些数据 使用公钥(服务器)加密密码 将加密数据发送到客户端(服务器) 使用私钥(客户端)解密加密的256位密码 解密文件 基本上我知道如何处理AES加密/解密和通信协议,它们已经实现了,我的问题是RSA,我需要hex格式而不是base64或pem,因为我正在使用套接字并发送和存储为二进制数据。

SMTPS:OpenSSL – SSL例程:SSL23_GET_SERVER_HELLO:未知协议s23_clnt.c:787:

我正在使用OpenSSL来加密一些硬件发送的电子邮件。 但是,每当我尝试调用SSL_connect()时,我都会得到:SSL例程:SSL23_GET_SERVER_HELLO:未知协议 发送“EHLO”和“STARTTLS”后,我调用以下函数: SSL_CTX *ctx = NULL; SSL *ssl = NULL; void CreateTLSSession(int sockfd) { printf(“///////////////creating TLS Session/////////////////////\n”); SSL_library_init(); SSL_load_error_strings(); OpenSSL_add_all_algorithms(); ctx = SSL_CTX_new(SSLv23_client_method()); if (ctx == NULL) { printf(“failed to initialize context\n”); return; } SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2); ssl = SSL_new(ctx); if (!SSL_set_fd(ssl, sockfd)) { printf(“failed to bind to socket fd\n”); return; } if (SSL_connect(ssl) < […]

Openssl:在SSL_CTX_load_verify_locations API中使用CApath参数时,证书validation失败

我正在尝试与服务器计算机建立TLS连接。 我使用openssl CLI命令创建了根CA证书和服务器证书。 我创建了服务器证书,其通用名称与其IP地址相同。 根CA证书的通用名称是服务器的FQDN。 我正在使用openssl库API建立与服务器的连接。 我正在使用API int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, const char *CApath) 用于设置CA文件查找路径。 当我使用CAfile参数指定我的CA文件的路径时,一切正常,将CApath参数保留为NULL。 但是,如果我使用CApath参数指定包含CA文件的目录的路径,将CAfile参数保留为NULL,则由于证书validation错误,连接将失败。 当我使用wireshark捕获数据包时,我发现我的客户端代码正在从服务器发送“服务器问候”的TLS响应“未知CA”。 我使用了在成功连接中使用的相同CA证书文件。 根据我在探索openssl库源代码时的观察,我推断,在我的情况下,CA文件不被认为是有效的,因此由于某些未知原因而未被库API加载。 有人可以告诉我原因,如果可能的话,可以解决这个问题吗?

openssl获取证书扩展

我正在使用openssl来解析X509证书。 我设法获得扩展,但我不知道如何提取扩展值。 我使用的代码是: X509_EXTENSION *extension = sk_X509_EXTENSION_pop(exts); int critical = X509_EXTENSION_get_critical(extension); ASN1_OBJECT *obj = extension-> object; ln = OBJ_nid2ln(OBJ_obj2nid(obj)); if( !ln ) ln = “”; OBJ_obj2txt(objbuf,sizeof(objbuf),obj,1); int nid = OBJ_txt2nid(ln); 这段代码告诉我扩展是否重要,并给出了扩展的nid。 我想通过以下方式可以获得价值: ASN1_OCTET_STRING * data = X509_EXTENSION_get_data(extension); 但我不知道如何处理检索到的data对象。 数据对象应该是der编码的。 有关如何获取扩展数据的任何想法? 编辑:正如这里建议的那样,我试图这样做: ASN1_OCTET_STRING* octet_str = X509_EXTENSION_get_data(extension); const unsigned char* octet_str_data = octet_str->data; long xlen; int tag, […]