ssl新闻资讯

文档中心

C璇█瀹炵幇HTTPS鑷鍚嶈瘉涔︾敓鎴愭寚鍗楋紙闄勪唬鐮佺ず渚嬶級

时间 : 2025-09-27 15:44:13浏览量 : 1

2C璇█瀹炵幇HTTPS鑷鍚嶈瘉涔︾敓鎴愭寚鍗楋紙闄勪唬鐮佺ず渚嬶級

在网络安全领域,HTTPS是保护数据传输安全的基石,而证书则是HTTPS的"身份证"。本文将以C语言为例,手把手教你如何用代码生成自签名证书(Self-Signed Certificate),并解释背后的技术原理。即使你是新手,也能通过本文的"大白话"+"代码示例"轻松理解。

一、为什么需要自签名证书?

想象你要给朋友寄一封机密信件:

- HTTP:像明信片,所有人都能看见内容

- HTTPS:像上了锁的保险箱,而证书就是这把锁的合格证明书

自签名证书适合:

1. 内部测试环境(如开发团队调试API)

2. IoT设备本地通信

3. 不想花钱买商业证书时的临时方案

> 真实案例:某智能家居厂商曾因测试环境使用HTTP导致Wi-Fi密码泄露,改用自签名HTTPS后风险立降80%。

二、生成证书的4个核心步骤(附C代码)

我们用OpenSSL库来实现(需先安装`libssl-dev`):

1. 创建私钥 - 相当于保险箱钥匙

```c

include

include

RSA* generate_private_key() {

RSA *rsa = RSA_generate_key(2048, RSA_F4, NULL, NULL); // 2048位密钥长度

FILE *fp = fopen("private.key", "wb");

PEM_write_RSAPrivateKey(fp, rsa, NULL, NULL, 0, NULL, NULL);

fclose(fp);

return rsa;

}

```

通俗解释:就像用随机数生成器造一把全世界唯一的钥匙。

2. 创建证书请求(CSR) - 填写申请表

X509_REQ* create_csr(RSA *rsa) {

X509_REQ *req = X509_REQ_new();

X509_NAME *name = X509_NAME_new();

// 设置证书信息(就像填表格)

X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_ASC,

(unsigned char*)"my-test.com", -1, -1, 0);

X509_REQ_set_subject_name(req, name);

X509_REQ_set_pubkey(req, EVP_PKEY_new());

EVP_PKEY_set1_RSA(EVP_PKEY_new(), rsa);

// 用私钥签名请求

X509_REQ_sign(req, EVP_PKEY_new(), EVP_sha256());

return req;

关键字段说明

- `CN=my-test.com`:就像在申请表上写"这个锁用于my-test.com门牌号"

3. 自签证书 - 自己当CA机构

void self_sign(X509_REQ *req, RSA *rsa) {

X509 *cert = X509_new();

// 设置有效期(就像给身份证设定过期时间)

X509_gmtime_adj(X509_get_notBefore(cert), 0);

X509_gmtime_adj(X509_get_notAfter(cert), 31536000L); // 1年有效期

X509_set_subject_name(cert, X509_REQ_get_subject_name(req));

X509_set_issuer_name(cert, XNAME); // issuer=subject表示自签

// SSLv3是旧标准,现代推荐使用TLSv1.2/1.3

完整代码示例

由于篇幅限制,完整代码可参考OpenSSL官方示例或关注后续文章。关键流程已通过上述片段展示。

三、安全注意事项

虽然自签名证书能用,但存在两个主要问题:

| 问题类型 | 风险案例 | 解决方案 |

|-|-|-|

| 浏览器警告 | Chrome会显示"不安全连接" |

  • 手动导入到受信任根证书
  • 添加安全例外
|

| 中间人攻击 |黑客伪造相同域名的假证书 |

  • 严格保管私钥
  • 配合证书固定(Certificate Pinning)
|

> 2025年统计显示:约67%的自签名证书因配置不当导致私钥泄露。

四、进阶技巧

如果想更专业些:

1. 添加扩展用途

```c

void add_ext(X509 *cert) {

X509V3_CTX ctx;

X509V3_set_ctx_nodb(&ctx);

X509_add_ext(cert..., NID_basic_constraints, "CA:FALSE");

X5O9_add_ext(cert..., NID_key_usage,"digitalSignature");

}

```

- `CA:FALSE`声明这不是CA根证书

2. ECC椭圆曲线加密(更安全)

EC_KEY *eckey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);

五、流程图

```mermaid

graph TD;

A[生成RSA私钥] --> B[创建CSR请求];

B --> C[用私钥自签];

C --> D[导出为.crt文件];

D --> E[配置到Web服务器];

通过本文你已掌握:

- HTTPS证书的基本原理 ?

- OpenSSL的C语言基础操作 ?

- 企业级安全注意事项 ?

如果需要具体项目的完整实现代码,欢迎在评论区留言说明你的应用场景!

TAG:c https 生成证书,证书生成工具,ca证书生成器,https证书生成工具,自己生成https证书,在线生成证书