X509_verify_cert返回值
时间: 2023-06-22 12:32:38 浏览: 458
X509_verify_cert函数是OpenSSL库中用于验证X.509证书链的函数。其返回值为整型,表示验证结果,具体取值如下:
- 1:验证成功,证书链中的所有证书均可信且可用。
- 0:验证失败,证书链中至少有一个证书不可信或不可用。
- -1:验证过程中出现错误,例如内存分配失败、证书格式错误等。
- -2:证书链中有证书已经过期。
- -3:证书链中有证书还未生效。
- -4:证书链中有证书被吊销。
- -5:证书链中有证书签名无效。
需要注意的是,X509_verify_cert函数只能验证证书链是否可信和可用,不能验证证书是否与其所声称的主体相对应,也不能验证证书的用途是否符合需求。如果需要进行更加细致的验证,需要使用其他函数或工具。
相关问题
将如下代码改成一个函数#include <string.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #include <openssl/ssl.h> #include <openssl/err.h> #define MAX_BUF_SIZE 1024 int main(int argc, char *argv[]) { int sockfd, ret; char *url = argv[1]; // 输入的 url char *cert_path = argv[2]; // 输入的证书路径 struct sockaddr_in servaddr; SSL_CTX *ctx; SSL *ssl; char buf[MAX_BUF_SIZE]; // 初始化 SSL 库 SSL_library_init(); OpenSSL_add_all_algorithms(); SSL_load_error_strings(); // 创建 SSL 上下文 ctx = SSL_CTX_new(TLS_client_method()); if (ctx == NULL) { printf("SSL_CTX_new error.\n"); return -1; } // 加载证书 ret = SSL_CTX_load_verify_locations(ctx, cert_path, NULL); if (ret != 1) { printf("SSL_CTX_load_verify_locations error.\n"); return -1; } // 创建 socket sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { printf("socket error.\n"); return -1; } // 设置服务器地址 memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(443); inet_pton(AF_INET, url, &servaddr.sin_addr); // 连接服务器 ret = connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); if (ret < 0) { printf("connect error.\n"); return -1; } // 创建 SSL 对象 ssl = SSL_new(ctx); if (ssl == NULL) { printf("SSL_new error.\n"); return -1; } SSL_set_fd(ssl, sockfd); // 建立 SSL 连接 ret = SSL_connect(ssl); if (ret != 1) { printf("SSL_connect error.\n"); return -1; } // 发送请求 char *request = "GET / HTTP/1.1\r\nHost: %s\r\n\r\n"; sprintf(buf, request, url); SSL_write(ssl, buf, strlen(buf)); // 接收响应 while (1) { memset(buf, 0, sizeof(buf)); ret = SSL_read(ssl, buf, sizeof(buf) - 1); if (ret < 0) { printf("SSL_read error.\n"); break; } else if (ret == 0) { break; } else { printf("%s", buf); } } // 关闭 SSL 连接 SSL_shutdown(ssl); SSL_free(ssl); // 关闭 socket close(sockfd); // 清理 SSL 上下文 SSL_CTX_free(ctx); return 0; }
好的,下面是将代码改写成一个函数的结果:
```
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#define MAX_BUF_SIZE 1024
int https_request(const char *url, const char *cert_path) {
int sockfd, ret;
struct sockaddr_in servaddr;
SSL_CTX *ctx;
SSL *ssl;
char buf[MAX_BUF_SIZE];
// 初始化 SSL 库
SSL_library_init();
OpenSSL_add_all_algorithms();
SSL_load_error_strings();
// 创建 SSL 上下文
ctx = SSL_CTX_new(TLS_client_method());
if (ctx == NULL) {
printf("SSL_CTX_new error.\n");
return -1;
}
// 加载证书
ret = SSL_CTX_load_verify_locations(ctx, cert_path, NULL);
if (ret != 1) {
printf("SSL_CTX_load_verify_locations error.\n");
return -1;
}
// 创建 socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
printf("socket error.\n");
return -1;
}
// 设置服务器地址
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(443);
inet_pton(AF_INET, url, &servaddr.sin_addr);
// 连接服务器
ret = connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
if (ret < 0) {
printf("connect error.\n");
return -1;
}
// 创建 SSL 对象
ssl = SSL_new(ctx);
if (ssl == NULL) {
printf("SSL_new error.\n");
return -1;
}
SSL_set_fd(ssl, sockfd);
// 建立 SSL 连接
ret = SSL_connect(ssl);
if (ret != 1) {
printf("SSL_connect error.\n");
return -1;
}
// 发送请求
char *request = "GET / HTTP/1.1\r\nHost: %s\r\n\r\n";
sprintf(buf, request, url);
SSL_write(ssl, buf, strlen(buf));
// 接收响应
while (1) {
memset(buf, 0, sizeof(buf));
ret = SSL_read(ssl, buf, sizeof(buf) - 1);
if (ret < 0) {
printf("SSL_read error.\n");
break;
} else if (ret == 0) {
break;
} else {
printf("%s", buf);
}
}
// 关闭 SSL 连接
SSL_shutdown(ssl);
SSL_free(ssl);
// 关闭 socket
close(sockfd);
// 清理 SSL 上下文
SSL_CTX_free(ctx);
return 0;
}
```
函数名称为 `https_request`,接受两个参数,分别是 `url` 和 `cert_path`。函数返回值为整型,表示函数执行结果。在函数内部,我们使用了原始代码中的大部分代码,只是将 `main` 函数中的一些变量名做了一些修改,以符合函数的参数列表。
C mosquitto_tls_opts_set()
### C语言中的`mosquitto_tls_opts_set`函数
#### 函数原型
```c
int mosquitto_tls_opts_set(struct mosquitto *mosq, int cert_reqs, const char *tls_version, const char *ciphers);
```
此函数用于设置TLS/SSL连接选项,这些选项影响客户端如何验证服务器证书以及协商加密参数[^3]。
#### 参数说明
- `struct mosquitto *mosq`: 已创建的Mosquitto客户端实例指针。
- `int cert_reqs`: 设置对等方提供有效证书的要求级别。可以取值如下:
- `MOSQ_SSL_VERIFY_NONE`: 不请求对方发送证书;
- `MOSQ_SSL_VERIFY_PEER`: 请求并强制验证对方提供的证书有效性。
- `const char *tls_version`: 指定使用的最低版本号字符串形式的TLS协议版本(如:"tlsv1.2")。如果设为空,则默认支持所有可用版本。
- `const char *ciphers`: 定义允许使用的密码套件列表;留空表示采用编译库时配置好的默认集。
调用该方法之前应当已经通过其他API初始化好了一个有效的MQTT会话对象,并且打算启用安全传输层保护通信链路[^4]。
#### 返回值解释
成功返回0;失败则返回错误码,具体含义参见官方手册获取更多信息。
为了确保SFTP协议的安全性,在涉及文件传输操作前建议先完成上述SSL/TLS层面的身份认证与数据加密措施部署工作[^2]。
阅读全文
相关推荐












