OpenSSL 详细介绍

OpenSSL 详细介绍

OpenSSL 详细介绍

一、概述

OpenSSL是一个开源的、功能强大的密码学工具包,广泛用于实现 SSL(Secure Sockets Layer)和 TLS(Transport Layer Security)协议,以及提供通用的密码学功能。它是互联网安全通信的基石,几乎所有的 HTTPS 服务都直接或间接依赖它。

  • 官方网站:https://www.openssl.org
  • 源代码仓库:https://github.com/openssl/openssl
  • 许可证:Apache 2.0 风格的双许可证(自 3.0 起),此前为 OpenSSL License + SSLeay License
  • 开发语言:C 语言,辅以 Perl 脚本用于构建系统
  • 首个版本:1998 年(源自 Eric A. Young 和 Tim J. Hudson 的 SSLeay 库)

二、核心组件

OpenSSL 由三个核心模块构成:

2.1 libssl — SSL/TLS 协议实现

这是 OpenSSL 最核心的部分,完整实现了 TLS 协议族:

协议版本说明
SSL 3.0已废弃,不再安全
TLS 1.0 / 1.1已被 RFC 8996 正式废弃
TLS 1.2当前广泛使用的版本(RFC 5246)
TLS 1.3最新版本(RFC 8446),在性能和安全性上有显著提升
DTLS 1.0 / 1.2基于 UDP 的数据报 TLS

TLS 1.3 的关键改进:

  • 握手过程从 2-RTT 减少到 1-RTT
  • 支持 0-RTT 模式(Early Data)
  • 移除了所有不安全的密码套件
  • 完美前向保密(PFS)成为强制要求

2.2 libcrypto — 通用密码学库

提供丰富的底层密码学原语:

对称加密算法

  • AES(ECB/CBC/CTR/GCM/CCM 模式)
  • DES、3DES(已废弃)
  • ChaCha20、ChaCha20-Poly1305
  • Camellia、ARIA、SM4(中国商密算法)

非对称加密算法

  • RSA、DSA
  • Diffie-Hellman(DH)、ECDH
  • ECDSA、EdDSA(Ed25519/Ed448)

哈希算法

  • SHA-1(已不推荐用于安全场景)
  • SHA-2 家族(SHA-224/256/384/512)
  • SHA-3 家族
  • SM3(中国商密哈希算法)
  • BLAKE2

其他能力

  • 大数运算(BIGNUM)
  • 随机数生成(PRNG + 熵源)
  • X.509 证书管理
  • PKCS#12 / PKCS#7
  • ASN.1 编解码
  • OCSP / CRL 吊销检查
  • PEM / DER 格式处理

2.3 OpenSSL 命令行工具

一个功能丰富的 CLI 工具,用于:

# 生成 RSA 私钥openssl genpkey-algorithmRSA-outprivate.key# 生成证书签名请求 (CSR)openssl req-new-keyprivate.key-outrequest.csr# 查看证书内容openssl x509-incertificate.pem-text-noout# 测试 TLS 连接openssl s_client-connectexample.com:443# 计算文件哈希openssl dgst-sha256file.txt# 对称加密文件openssl enc -aes-256-gcm-inplaintext.txt-outciphertext.bin# Base64 编解码echo"hello"|openssl base64# 生成随机字节openssl rand-hex32

三、版本演进

主要里程碑

版本发布时间重要特性
0.9.x1998-2010最初的长期维护分支
1.0.02010.03重构加密层,引入 FIPS 模块
1.0.12012.03TLS 1.2 完整支持
1.0.22015.01LTS 版本,2019 年底停止维护
1.1.02016.08API 重构,改善多线程支持
1.1.12018.09LTS 版本,第一个完整 TLS 1.3 支持的版本;2023.09 已 EOL
3.02021.09LTS 版本,FIPS 140-3 模块,Provider 架构重构;维护至 2026.09
3.12023.03功能版本,性能优化
3.22023.11QUIC 客户端支持
3.32024.04QUIC 完整支持
3.42024.10当前最新稳定版

OpenSSL 3.x 的重大架构变更

Provider 架构是 3.0 最重要的变革:

传统 1.x: 所有算法内置在 libcrypto 中,不可分离 3.x Provider 架构: libcrypto 核心(轻量)→ 动态加载 Provider ├── default provider(内置算法) ├── fips provider(FIPS 140-3 认证算法) ├── legacy provider(MD4, RC4, DES 等淘汰算法) └── third-party provider(第三方 Provider)

这种设计的好处:

  • FIPS 认证的密码学边界更清晰
  • 第三方可以独立提供密码学实现
  • 减小核心库体积
  • 更好的安全隔离

四、编程接口

4.1 基本的 SSL 客户端

#include<openssl/ssl.h>#include<openssl/err.h>// 1. 初始化SSL_library_init();SSL_CTX*ctx=SSL_CTX_new(TLS_client_method());// 2. 创建 socket 并连接intsockfd=socket(AF_INET,SOCK_STREAM,0);connect(sockfd,...);// 3. 创建 SSL 对象并与 socket 绑定SSL*ssl=SSL_new(ctx);SSL_set_fd(ssl,sockfd);// 4. 执行 TLS 握手SSL_connect(ssl);// 5. 加密通信SSL_write(ssl,"GET / HTTP/1.1\r\n",16);charbuf[4096];intn=SSL_read(ssl,buf,sizeof(buf));// 6. 清理SSL_shutdown(ssl);SSL_free(ssl);SSL_CTX_free(ctx);close(sockfd);

4.2 EVP 高级 API(推荐方式)

OpenSSL 推荐使用 EVP(Envelope)API,它在不同版本间保持更好的兼容性:

#include<openssl/evp.h>// AES-256-GCM 对称加密EVP_CIPHER_CTX*cctx=EVP_CIPHER_CTX_new();EVP_EncryptInit_ex(cctx,EVP_aes_256_gcm(),NULL,key,iv);intlen;unsignedcharciphertext[1024];EVP_EncryptUpdate(cctx,ciphertext,&len,plaintext,plaintext_len);intpadlen;EVP_EncryptFinal_ex(cctx,ciphertext+len,&padlen);EVP_CIPHER_CTX_free(cctx);

五、FIPS 140 认证

OpenSSL 3.0 的 FIPS Provider 通过了FIPS 140-3认证(证书号 #4282),这是美国联邦政府要求密码学模块必须满足的安全标准。FIPS 模块独立编译,具有明确的密码学边界:

# 在支持的 Linux 上启用 FIPS Provideropenssl fipsinstall-outfipsmodule.cnf-module/usr/lib/ossl-modules/fips.so

在配置文件中:

openssl_conf = openssl_init [openssl_init] providers = provider_sect [provider_sect] fips = fips_sect base = base_sect [base_sect] activate = 1

六、安全事件与教训

年份漏洞/事件影响
2014Heartbleed(CVE-2014-0160)TLS 心跳扩展的缓冲区越界读取。攻击者可从服务器内存中窃取私钥、会话凭证、密码等敏感数据。这是互联网历史上最严重的安全漏洞之一。
2014CCS Injection(CVE-2014-0224)中间人攻击,允许攻击者强制将加密降级
2015Key Recovery Attack(CVE-2016-0701)DH 密钥交换中的私钥恢复
2022CVE-2022-3602 / CVE-2022-3786X.509 证书验证中的缓冲区溢出(OpenSSL 3.0.x)

Heartbleed 后,OpenSSL 项目获得了更多资金和人力资源投入,代码质量和审查流程显著改善,这也是其代码库重构(1.1 → 3.0)的推动力之一。


七、国产化与国密支持

从 OpenSSL 1.1.1 开始,SM(商密)算法逐步被纳入主分支:

  • SM2:椭圆曲线公钥密码算法(类似 ECDSA)
  • SM3:密码杂凑算法(256 位哈希)
  • SM4:分组密码算法(128 位密钥)

在 OpenSSL 3.x 中可通过默认 Provider 直接使用:

# 生成 SM2 密钥对openssl genpkey-algorithmSM2-outsm2.pem# 使用 SM3 计算哈希openssl dgst-sm3file.txt# 使用 SM4-CBC 加密openssl enc -sm4-cbc-inplain.txt-outcipher.bin-K<hexkey>-iv<hexiv>

八、替代品与竞争

语言特点
BoringSSLCGoogle 维护的 OpenSSL 分支,简化了 API
LibreSSLCOpenBSD 项目维护,重视代码安全与简洁
wolfSSLC面向嵌入式和 IoT 的轻量级实现
mbedTLSCARM 维护,适合资源受限设备
NSSCMozilla 维护,Firefox 使用
GnuTLSCGNU 项目,LGPL 许可
RustlsRust用 Rust 编写的 TLS 实现,内存安全
s2n-tlsCAmazon 的极简 TLS 实现

九、TLS 握手协议深度解析

9.1 TLS 1.2 完整握手(2-RTT)

Client Server ClientHello --------> (支持的密码套件、随机数、 TLS 版本、SNI 扩展) ServerHello <-------- (选定的密码套件、随机数) Certificate <-------- (服务器X.509证书链) ServerKeyExchange <-------- (DH/ECDH参数,如有) CertificateRequest <-------- (如需客户端证书) ServerHelloDone <-------- ClientKeyExchange --------> (预主密钥,用服务器公钥加密) CertificateVerify --------> (客户端证书签名,如要求) [ChangeCipherSpec] --------> (切换到协商的加密参数) Finished --------> (握手消息完整性验证) [ChangeCipherSpec] <-------- Finished <-------- Application Data <-------> Application Data

主密钥派生过程

pre_master_secret → PRF("master secret", pre_master_secret, ClientHello.random + ServerHello.random) → master_secret (48字节) master_secret → PRF(master_secret, "key expansion", ServerHello.random + ClientHello.random) → key_block (对称密钥 + MAC密钥 + IV)

9.2 TLS 1.3 握手(1-RTT)

Client Server ClientHello --------> (+ 密钥协商参数猜测、 支持的AEAD密码套件、 服务器已知的PSK标识) ServerHello <-------- (选定参数、随机数) {EncryptedExtensions} <-------- (服务器参数、ALPN等) {Certificate} <-------- (服务器证书链) {CertificateVerify} <-------- (身份签名) {Finished} <-------- {Finished} --------> [Application Data] --------> [Application Data] <--------

关键差异

特性TLS 1.2TLS 1.3
握手往返2-RTT1-RTT(首次),PSK 可 0-RTT
密码套件约 50+ 种组合仅 5 个标准 AEAD 套件
密钥交换RSA / DH / ECDH仅 (EC)DHE,强制 PFS
证书加密明文发送握手期间加密
完成时间~300 ms~100 ms(首次)
降级保护Finished 中的降级信号

9.3 0-RTT 早期数据(TLS 1.3 PSK 模式)

Client Server ClientHello --------> (+ pre_shared_key扩展、 早期数据指示、"early_data") {Finished} [Application Data*] --------> ← 0-RTT 数据 ServerHello <-------- {EncryptedExtensions} <-------- {Finished} <-------- [Application Data*] <-------> [Application Data] <------->

0-RTT 的重放风险:攻击者可重放 0-RTT 请求使其在服务器重复执行。因此仅幂等操作(如 GET 请求)适合 0-RTT。缓解方案:客户端在 ClientHello 中发送ticket_age,服务器检测时间异常。也可通过TLS_AES_128_GCM_SHA256等密码套件的 nonce 机制检测重放。


十、密码学原语深入

10.1 椭圆曲线密码学(ECC)详解

OpenSSL 支持的曲线:

NIST 曲线(Prime Field):

  • P-256(secp256r1)— 128 位安全性
  • P-384(secp384r1)— 192 位安全性
  • P-521(secp521r1)— 256 位安全性

Curve25519/Curve448(推荐使用):

  • X25519 — 基于 Montgomery 形式的 ECDH(RFC 7748)
  • Ed25519 — 基于 Edwards 形式的 EdDSA 签名(RFC 8032)
  • X448 / Ed448 — 高安全性变体

SM2 曲线

  • SM2 P-256v1 — 中国国密标准椭圆曲线
// 生成 X25519 密钥对(推荐)EVP_PKEY_CTX*pctx=EVP_PKEY_CTX_new_id(EVP_PKEY_X25519,NULL);EVP_PKEY_keygen_init(pctx);EVP_PKEY*pkey=NULL;EVP_PKEY_keygen(pctx,&pkey);// 执行 ECDH 密钥交换EVP_PKEY_CTX*dctx=EVP_PKEY_CTX_new(peer_pubkey,NULL);EVP_PKEY_derive_init(dctx);EVP_PKEY_derive_set_peer(dctx,peer_pubkey);size_tsecret_len;EVP_PKEY_derive(dctx,NULL,&secret_len);unsignedchar*shared_secret=OPENSSL_malloc(secret_len);EVP_PKEY_derive(dctx,shared_secret,&secret_len);

10.2 AEAD 密码套件(TLS 1.3 强制)

AEAD(Authenticated Encryption with Associated Data)同时提供加密和完整性验证:

AES-GCM(Galois/Counter Mode):

加密: ciphertext = AES-CTR_encrypt(key, nonce, plaintext) tag = GHASH(key, associated_data || ciphertext || len_encoding) → 输出 = ciphertext || tag (16字节认证标签) 解密: 先验证 GHASH 标签,验证失败则不输出任何明文

ChaCha20-Poly1305(移动端优先):

加密: keystream = ChaCha20(key, nonce, counter=1) ciphertext = plaintext XOR keystream poly1305_key = ChaCha20(key, nonce, counter=0) tag = Poly1305(poly1305_key, associated_data || ciphertext || padding) → 输出 = ciphertext || tag (16字节认证标签) 优势: 无 AES-NI 硬件的平台(ARM 移动设备)性能优秀 常量时间实现,无缓存侧信道风险
# 命令行使用 AES-GCMopenssl enc -aes-256-gcm-inplain.txt-outcipher.bin-K$(xxd-pkey.bin)-iv$(xxd-piv.bin)# 命令行使用 ChaCha20-Poly1305openssl enc -chacha20-poly1305-inplain.txt-outcipher.bin-K$(xxd-pkey.bin)-iv$(xxd-piv.bin)

10.3 密钥派生函数(KDF)

HKDF(HMAC-based Key Derivation Function,RFC 5869) — TLS 1.3 使用:

HKDF-Extract(salt, IKM) → PRK (伪随机密钥) PRK = HMAC-Hash(salt, IKM) // salt=0 时使用全 0 的 HashLen 字节 HKDF-Expand(PRK, info, L) → OKM (L字节输出密钥材料) T(0) = "" T(1) = HMAC-Hash(PRK, T(0) || info || 0x01) T(2) = HMAC-Hash(PRK, T(1) || info || 0x02) ... OKM = T(1) || T(2) || ... (取前 L 字节)

TLS 1.3 中的 HKDF 应用:

# 握手阶段 early_secret = HKDF-Extract(salt=0, IKM=PSK) handshake_secret = HKDF-Extract(salt=Derive-Secret(early_secret, "derived", ""), IKM=DH_shared) master_secret = HKDF-Extract(salt=Derive-Secret(handshake_secret, "derived", ""), IKM=0) # 派生实际密钥 client_handshake_traffic_secret = HKDF-Expand-Label(handshake_secret, "c hs traffic", "", Hash.length) server_handshake_traffic_secret = HKDF-Expand-Label(handshake_secret, "s hs traffic", "", Hash.length) client_application_traffic_secret_0 = HKDF-Expand-Label(master_secret, "c ap traffic", "", Hash.length) server_application_traffic_secret_0 = HKDF-Expand-Label(master_secret, "s ap traffic", "", Hash.length)

PBKDF2(用于密码 → 密钥):

# 从弱密码派生强密钥(10 万次迭代,推荐值)openssl enc -aes-256-gcm-pbkdf2-iter100000-infile.txt-outfile.enc

scrypt(内存硬 KDF,抗 ASIC 攻击):

# scrypt 参数:N=2^14 (16384), r=8, p=1openssl kdf-keylen32-kdfoptdigest:SHA256-kdfoptpass:mypassword\-kdfoptN:16384-kdfoptr:8-kdfoptp:1 SCRYPT

十一、X.509 证书体系详解

11.1 证书链验证

根CA证书(自签名,预装于Trust Store) │ 签名/颁发 ▼ 中间CA证书(Intermediate CA) │ 签名/颁发 ▼ 终端实体证书(Leaf Certificate)
# 构建完整证书链catserver.crt intermediate.crt>chain.crt# 验证证书链openssl verify-CAfileroot.pem-untrustedintermediate.pem server.crt# 检查证书有效期openssl x509-incert.pem-noout-dates# 查看证书中的 Subject Alternative Names (SAN)openssl x509-incert.pem-noout-extsubjectAltName# OCSP 在线吊销查询openssl ocsp-issuerissuer.pem-certserver.crt\-urlhttp://ocsp.example.com-no_nonce-text# CRL 吊销列表检查openssl verify-crl_check-CRLfilecrl.pem cert.pem

11.2 自建 CA 与签发

# 第一步:生成根 CA 私钥和证书openssl genpkey-algorithmRSA-pkeyoptrsa_keygen_bits:4096\-outca.key openssl req-x509-new-keyca.key-sha512-days3650\-subj"/C=CN/ST=Beijing/O=MyOrg/CN=My Root CA"\-extensionsv3_ca\-outca.crt# 第二步:生成服务器密钥和 CSRopenssl genpkey-algorithmEC-pkeyoptec_paramgen_curve:P-256\-outserver.key openssl req-new-keyserver.key-sha512\-subj"/C=CN/ST=Beijing/O=MyOrg/CN=myserver.local"\-addext"subjectAltName=DNS:myserver.local,DNS:www.myserver.local"\-outserver.csr# 第三步:用根 CA 签发服务器证书openssl x509-req-inserver.csr-CAca.crt-CAkeyca.key\-days365-sha512\-copy_extensionscopy\-outserver.crt# 验证openssl verify-CAfileca.crt server.crt

11.3 证书透明度(Certificate Transparency, CT)

现代 TLS 生态要求 CA 将签发的证书提交到 CT 日志服务器,用于审计和检测恶意证书。OpenSSL 支持 SCT(Signed Certificate Timestamp)扩展:

# 查看证书中的 SCTopenssl x509-incert.pem-noout-text|grep-A5"SCT"

十二、性能优化与硬件加速

12.1 CPU 指令集加速

指令集加速的算法性能提升
AES-NIAES 加密/解密(ECB/CBC/CTR/GCM)3-10×
SHA-NISHA-1, SHA-256(Intel Goldmont+)2-5×
CLMULGCM 模式 GHASH(无进位乘法)5-10×
AVX-512ChaCha20-Poly1305(并行流密码)2-4×
ARMv8 CryptoAES、SHA、GHASH(ARM 架构)3-8×
Intel QAT非对称算法(RSA/ECDSA)卸载20-50×
# 查看已编译启用的优化openssl version-a# 性能基准测试openssl speed-evpaes-256-gcm openssl speed-evpsha256 openssl speed rsa4096 ecdsap256 openssl speed x25519 ed25519

12.2 会话复用

Session ID(有状态)

# 服务器端:缓存 session ID# 客户端:通过 -sess_out / -sess_in 复用openssl s_client-connecthost:443-sess_outsession.pem openssl s_client-connecthost:443-sess_insession.pem# 复用

Session Ticket(无状态,TLS 1.2)

服务器生成对称密钥加密会话参数 → Ticket 发送给客户端 客户端下次连接时带上 Ticket → 服务器解密恢复会话 → 跳过密钥交换

PSK(Pre-Shared Key,TLS 1.3 替代方案)

首次连接后协商 PSK → 后续连接的首次 ClientHello 即提供 PSK → 可实现 0-RTT

12.3 异步操作模式

OpenSSL 3.0 支持异步 I/O 和加密硬件加速的异步处理:

// 异步模式下创建 SSL 上下文SSL_CTX*ctx=SSL_CTX_new(TLS_method());// 设置异步模式(需要回调)SSL_set_mode(ssl,SSL_MODE_ASYNC);// 使用非阻塞 I/OSSL_set_fd(ssl,fd);intret;do{ret=SSL_accept(ssl);if(ret<=0){interr=SSL_get_error(ssl,ret);if(err==SSL_ERROR_WANT_ASYNC){// 等待异步操作完成// fd 就绪后调用 SSL_do_handshake(ssl)}elseif(err==SSL_ERROR_WANT_READ||err==SSL_ERROR_WANT_WRITE){// 非阻塞 I/O,等待 fd 就绪}}}while(ret<=0);

十三、安全最佳实践

13.1 推荐配置(2024)

# Nginx 推荐配置 ssl_protocols TLSv1.2 TLSv1.3; # 仅 TLS 1.2+ ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256: # 优先 PFS ECDHE-RSA-AES128-GCM-SHA256: ECDHE-ECDSA-AES256-GCM-SHA384: ECDHE-RSA-AES256-GCM-SHA384: ECDHE-ECDSA-CHACHA20-POLY1305: ECDHE-RSA-CHACHA20-POLY1305; ssl_prefer_server_ciphers on; ssl_ecdh_curve X25519:secp256r1:secp384r1; # 优先现代曲线 ssl_session_tickets off; # 禁用 session ticket(PFS 考虑) ssl_dhparam /etc/ssl/dhparam4096.pem; # 自定义 DH 参数

13.2 DH 参数生成

# 生成 4096 位 DH 参数(耗时,建议预制)openssl dhparam-outdhparam4096.pem4096

13.3 私钥保护

# 生成加密私钥(AES-256-GCM + PBKDF2)openssl genpkey-algorithmRSA-pkeyoptrsa_keygen_bits:4096\-aes-256-gcm-outencrypted.key# 解密私钥openssl pkey-inencrypted.key-outdecrypted.key# 从 PKCS#12 提取私钥openssl pkcs12-inbundle.pfx-nocerts-nodes-outprivate.key

13.4 HSTS (HTTP Strict Transport Security)

应用层配合:

Strict-Transport-Security: max-age=63072000; includeSubDomains; preload

十四、构建与集成

14.1 Linux 编译选项

# 从源码构建(推荐配置)./Configure\--prefix=/usr/local/openssl-3.4\--openssldir=/etc/ssl\--release\enable-fips\enable-ec_nistp_64_gcc_128\enable-rfc3779\enable-sctp\enable-tfo\enable-ktls\no-weak-ssl-ciphers\no-ssl3\no-tls1\no-tls1_1\no-dtls1\no-dtls1_2\linux-x86_64make-j$(nproc)maketestsudomakeinstall

14.2 与 HTTP 库集成

libcurl(最常见):

# libcurl 默认使用系统的 OpenSSLcurl--version|grep-issl

各语言绑定:使用系统 OpenSSL 的语言包括 Python(ssl 模块)、Ruby(OpenSSL gem)、Go(crypto/tls,自有实现)、Java(JSSE,可通过 PKCS#11 桥接)等。

14.3 QUIC / HTTP/3 支持

OpenSSL 3.2+ 提供 QUIC 传输层 API:

// QUIC 客户端(OpenSSL 3.3+ 完整支持)SSL_CTX*ctx=SSL_CTX_new(OSSL_QUIC_client_method());SSL*ssl=SSL_new(ctx);// 配置 QUIC 特定选项SSL_set_alpn_protos(ssl,"\x05h3",6);// HTTP/3 ALPN// 连接SSL_set_initial_peer_addr(ssl,&peer_addr);SSL_connect(ssl);// QUIC Stream 读写SSL*stream=SSL_new_stream(ssl,0);SSL_write(stream,data,len);

十五、调试与诊断

# 详细 TLS 连接调试openssl s_client-connectexample.com:443-tlsextdebug-msg-debug# 测试特定协议版本openssl s_client-connectexample.com:443-tls1_3openssl s_client-connectexample.com:443-tls1_2# 测试特定密码套件openssl s_client-connectexample.com:443-ciphersuites\TLS_AES_256_GCM_SHA384# 扫描服务器支持的密码套件(nmap 方式)nmap--scriptssl-enum-ciphers-p443example.com# 使用 testssl.sh 进行全面安全审计gitclone https://github.com/drwetter/testssl.sh.git ./testssl.sh/testssl.sh https://example.com# 生成 SSL 密钥日志(配合 Wireshark 解密)exportSSLKEYLOGFILE=/tmp/sslkeys.log# 然后用 Wireshark 加载此文件# 检查证书过期(Shell 脚本)echo|openssl s_client-servernameexample.com\-connectexample.com:4432>/dev/null|\openssl x509-noout-dates-checkend2592000# 30天预警

十六、总结

OpenSSL 是互联网安全事实上的标准库。尽管历史上有过严重漏洞,但其 3.x 系列通过Provider 架构重构FIPS 140-3 认证国密算法原生支持代码质量持续改进,仍然是生产环境中 TLS/密码学需求的首选解决方案。对于新项目,建议直接使用 OpenSSL 3.4+ 并通过 EVP 高级 API 进行开发,以获得最好的前向兼容性和安全性。