下面的代码 参数证书路径 对应的证书需要是什么格式的 #include <openssl/ssl.h> #include <openssl/bio.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> int https_request(const char* cert_file, const char* payload) { SSL_CTX* ctx = NULL; SSL* ssl = NULL; BIO* bio = NULL; int ret = -1; SSL_library_init(); ctx = SSL_CTX_new(SSLv23_client_method()); if(!ctx) { fprintf(stderr, "SSL_CTX_new failed!\n"); goto END; } if(SSL_CTX_load_verify_locations(ctx, cert_file, NULL) <= 0) { fprintf(stderr, "SSL_CTX_load_verify_locations failed!\n"); goto END; } if(SSL_CTX_use_certificate_file(ctx, cert_file, SSL_FILETYPE_PEM) <= 0) { fprintf(stderr, "SSL_CTX_use_certificate_file failed!\n"); goto END; } if(SSL_CTX_use_PrivateKey_file(ctx, cert_file, SSL_FILETYPE_PEM) <= 0) { fprintf(stderr, "SSL_CTX_use_PrivateKey_file failed!\n"); goto END; } bio = BIO_new_ssl_connect(ctx); if(!bio) { fprintf(stderr, "BIO_new_ssl_connect failed!\n"); goto END; } if(BIO_set_conn_hostname(bio, "www.example.com:https") <= 0) { fprintf(stderr, "BIO_set_conn_hostname failed!\n"); goto END; } BIO_get_ssl(bio, &ssl); if(!ssl) { fprintf(stderr, "BIO_get_ssl failed!\n"); goto END; } SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY); if(BIO_do_connect(bio) <= 0) { fprintf(stderr, "BIO_do_connect failed!\n"); goto END; } if(SSL_get_verify_result(ssl) != X509_V_OK) { fprintf(stderr, "SSL_get_verify_result error!\n"); goto END; } if(BIO_write(bio, payload, strlen(payload)) <= 0) { fprintf(stderr, "BIO_write failed!\n"); goto END; } char buf[1024] = {0}; int n = 0; while((n = BIO_read(bio, buf, sizeof(buf))) > 0) { fwrite(buf, 1, n, stdout); } ret = 0; END: if(bio) { BIO_free_all(bio); } if(ctx) { SSL_CTX_free(ctx); } return ret; }
时间: 2024-04-28 18:25:33 浏览: 207
该代码中的参数证书路径对应的证书需要是 PEM 格式的。其中 SSL_CTX_use_certificate_file 和 SSL_CTX_use_PrivateKey_file 函数加载的证书也需要是 PEM 格式的。在 SSL_CTX_load_verify_locations 函数中,如果第二个参数为 NULL,则使用系统默认的证书库。如果需要使用自定义的证书库,则可以通过第二个参数指定证书库的路径。
相关问题
指出下面代码的问题 运行出现了段错误 #include <openssl/ssl.h> #include <openssl/bio.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <netinet/in.h> #include <netdb.h> #include <sys/socket.h> #include <openssl/err.h> void parse_url(char *url, char *protocol, char *domain, char path) { char ptr; if (strncmp(url, "http://", 7) == 0) { strcpy(protocol, "http"); ptr = url + 7; } else if (strncmp(url, "https://", 8) == 0) { strcpy(protocol, "https"); ptr = url + 8; } else { strcpy(protocol, ""); ptr = url; } char domain_end = strstr(ptr, "/"); if (domain_end == NULL) { strcpy(domain, ptr); strcpy(path, ""); } else { int len = domain_end - ptr; strncpy(domain, ptr, len); domain[len] = '\0'; strcpy(path, domain_end); } } int https_communication(char url, char message, char response) { int sockfd, err; struct sockaddr_in serv_addr; struct hostent *server; SSL_CTX *ctx; SSL *ssl; char buf[1024]; printf("test1111 " ); // 创建socket sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("ERROR opening socket"); return -1; } // 获取主机信息 server = gethostbyname(url); printf("test1111 " ); if (server == NULL) { perror("ERROR, no such host"); return -1; } // 设置服务地址 printf("test1111 " ); bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length); serv_addr.sin_port = htons(443); printf("test222 " ); // 连接服务器 if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) { perror("ERROR connecting"); return -1; } // 初始化SSL SSL_library_init(); ctx = SSL_CTX_new(TLS_method()); if (ctx == NULL) { perror("SSL_CTX_new"); return (-1); } // 设置支持的协议版本为 TLSv1.2 SSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION); SSL_CTX_set_max_proto_version(ctx, TLS1_2_VERSION); //ctx = SSL_CTX_new(TLSv1_2_client_method()); if (ctx == NULL) { perror("ERROR creating SSL context"); return -1; } printf("test1111 " ); // 创建SSL套接字 ssl = SSL_new(ctx); SSL_set_fd(ssl, sockfd); // SSL握手 err = SSL_connect(ssl); if (err < 0) { perror("ERROR performing SSL handshake"); return -1; } printf("test1111 " ); // 发送消息 char request[1024]; sprintf(request, "GET %s HTTP/1.1\r\nHost: %s\r\n\r\n", message, url); err = SSL_write(ssl, request, strlen(request)); if (err < 0) { perror("ERROR writing to socket"); return -1; } printf("test1111 " ); // 接收响应 bzero(buf, sizeof(buf)); err = SSL_read(ssl, buf, sizeof(buf)-1); if (err < 0) { perror("ERROR reading from socket"); return -1; } printf("test1111999999999 " ); strcpy(response, buf); // 关闭SSL套接字 SSL_free(ssl); SSL_CTX_free(ctx); // 关闭socket close(sockfd); return 0; } int main() { //char *url = "https://otaapi-sit.lotuscars.com.cn/v50/vehicle/api/register"; //char protocol[10], domain[100], path[1000]; //parse_url(url, protocol, domain, path); //printf("protocol: %s\n", protocol); //printf("domain: %s\n", domain); //printf("path: %s\n", path); char *url = "otaapi-sit.lotuscars.com.cn"; //const char *cert_path="/home/pi/Cdaima/certDHU.pem"; char *payload= "{"timestamp":1685523498,"sdkVersion":"1.0.30_1","vin":"LJUBMSA24PKFFF198","sign":"696c3034f04f2bd80c8929089a0deea8cf4812574b002a555f8af663e500c4ce"}"; char *response=NULL; //https_request(cert_path,payload,url) ; //gethostbyname(url); https_communication(url, payload, response); return 0; }
这段代码存在以下问题:
1. 函数声明和调用中的参数类型错误,url, message, response应该是字符数组类型,而不是字符类型。
2. parse_url函数中的path参数类型应该是字符数组类型而不是字符类型。
3. parse_url函数中的domain_end变量应该是字符指针类型而不是字符类型。
4. parse_url函数中的path参数应该使用strcpy函数而不是赋值操作。
5. https_communication函数中的response指针没有被初始化,应该先为其分配内存。
6. https_communication函数中的payload参数类型应该是字符指针类型而不是字符类型。
7. https_communication函数中的buf数组可能存在溢出问题,应该使用sizeof(buf)-1来避免。
8. 在https_communication函数中,SSL_library_init()应该在SSL_CTX_new()之前调用。
n file included from ../crypto/evp/e_sm4.c:19:0:../include/crypto/sm4.h:53:48: error: missing binary operator before token
引用\[1\]:根据您提供的信息,您在使用openssl自做CA自签发SSL证书时遇到了一个错误。错误提示是无法打开配置文件openssl.cnf,报错信息为No such file or directory。解决方法可以参考提供的文章\[1\]。引用\[2\]:另外,您还提到了一个例子,其中涉及到了安全提供者的配置。引用\[3\]:您还提到了添加jar包和修改security配置的方法。根据您提供的问题描述,您遇到了一个编译错误,缺少二进制运算符。根据提供的信息,无法确定具体的原因。请检查您的代码和依赖项,确保正确引入了所需的头文件和库文件,并正确使用二进制运算符。如果问题仍然存在,请提供更多的上下文信息,以便我们能够更好地帮助您解决问题。
#### 引用[.reference_title]
- *1* [9748:error:02001002:system library:fopen:No such file or directory:.\\crypto\\bio\\bss_file.c:168:fopen](https://blog.csdn.net/swanabin/article/details/48441121)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item]
- *2* *3* [SM4加密报错No such algorithm: SM4/ECB/PKCS5Padding](https://blog.csdn.net/qq_44646316/article/details/128368752)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
阅读全文