c# - 如何为 x509 证书指定 TLS 版本

标签 c# ssl x509certificate

我正在开发一个通过安全通信与服务器通信的应用程序。所以应用程序的用户应该选择一个客户端证书文件(x509 证书)我想增加用户指定 TLS 版本的可能性。我没有在 x509Certificate cert = new X509Certificate(FileName) 的实例中找到任何标识 TLS 版本的属性。 如何进行 ?

最佳答案

TLS 版本和 X509 证书版本是完全不同的两件事。如果您指的是 TLS 版本,则可以使用 openssl 库的各种版本的客户端/服务器方法指定它(可以设置为 SSL_CTX 或 SSL):

const SSL_METHOD *SSLv23_method(void);
const SSL_METHOD *TLSv1_2_method(void);
const SSL_METHOD *TLSv1_1_method(void);
const SSL_METHOD *TLSv1_method(void);
const SSL_METHOD *SSLv3_method(void);
const SSL_METHOD *SSLv2_method(void);

但如果您真的是指 X509 版本,则可以使用 openssl 库函数来定义它。 X509 结构包含一个证书信息结构,定义如下 (1.0.2l):

typedef struct x509_cinf_st {
    ASN1_INTEGER *version;      /* [ 0 ] default of v1 */
    ASN1_INTEGER *serialNumber;
    X509_ALGOR *signature;
    X509_NAME *issuer;
    X509_VAL *validity;
    X509_NAME *subject;
    X509_PUBKEY *key;
    ASN1_BIT_STRING *issuerUID; /* [ 1 ] optional in v2 */
    ASN1_BIT_STRING *subjectUID; /* [ 2 ] optional in v2 */
    STACK_OF(X509_EXTENSION) *extensions; /* [ 3 ] optional in v3 */
    ASN1_ENCODING enc;
} X509_CINF;

你很可能会使用下面的函数来处理版本:

X509_CINF_new(void); 
X509_CINF * d2i_X509_CINF(X509_CINF **val_out, const unsigned char **der_in, long length);
int i2d_X509_CINF(X509_CINF *val_in, unsigned char **der_out); 

但由于 v2 和 v3 包含可选字段,因此没有理由不包含 v3。

关于c# - 如何为 x509 证书指定 TLS 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47134708/

相关文章:

c++ - 如何在 C++ 中测试公钥/私钥对?

c# - Umbraco:具有SEO属性的Youtube视频选择器

c# - 立即窗口中的动态导致 'Microsoft.CSharp.RuntimeBinder.Binder' is not defined or imported 错误

c# - 如果该方法没有自己的 XML 注释,则在该方法实现的接口(interface)上获取 Intellisense

ssl - 解密 Wireshark 中的 HTTPS 流量不起作用

mongodb - Cosmos DB 错误 : com. mongodb.MongoCommandException:命令失败,错误 11: 'Database account is not found'

c# - 如何在 C# 方法中将小数作为参数发送

ssl - SSL 应用程序数据是否已压缩?

java - 将 X509 证书转换为 PEM 或 ASN.1/DER

ssl - OpenSSL DER 证书和 DER key 到 "combo"证书