MySQL创建用户带SSL认证,并且有SUBJECT和ISSUER的时候,报错[Note] X509 subject mismatch:

本文记录了在MySQL中配置SSL连接的详细步骤,包括使用简单的SSL验证分配账号,以及解决因subject和issuer信息不匹配导致的登录失败问题。通过逐步调试,最终实现了安全的SSL连接。

1 简单的SSL是OK的:

用简单的SSL的验证,分配帐号
mysql> GRANT ALL PRIVILEGES ON test.* TO 'test'@%· IDENTIFIED BY 'test'REQUIRE SSL;

然后在客户端登陆:
[aaaaaaaaaaa@XXnintmydbc000ctl ssl]$   /opt/mysql/product/mysql/bin/mysql -hXXcccmysql.abn-iad.XX.com -utest -ptest --ssl-ca=/home/aaaaaaaaaaa/ssl/ca-cert.pem --ssl-cert=/home/aaaaaaaaaaa/ssl/server-cert.pem --ssl-key=/home/aaaaaaaaaaa/ssl/server-key.pem
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 25139
Server version: 5.5.25a-log MySQL XX RelXXse

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clXXr the current input statement.

mysql> show grants;
+--------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for test@%                                                                                                                          |
+--------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' IDENTIFIED BY PASSWORD '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29' REQUIRE SSL WITH GRANT OPTION |
+--------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> exit

缺陷,任何创建的ssl的key,只要匹配ca-cert.pem和client-cert.pem和client-key.pem3者之间匹配上,就可以用ssl登陆上db服务器,
就算这个client的key是否与server的可以一致,只要cliet的3个pem之间一致就可以通过ssl的方式登陆db server,这就有安全隐患。
所以我们需要加上subject和issuer来验证client和server端的key一致。


2 同事发给我的ssl的信息如下,我需要用已经生成的这2个来创建用户:
subject: CN=nuc-bbbmysql-client.nucleus.XX.com, OU=XX Online/Pogo.com, O="Xxxxxxxxc Xxxx, Inc.", S=California, C=US
issuer: E=wwtso-ssl-admins@XX.com, CN="Xxxxxxxxc Xxxx, Inc CA", OU=XX Online/Pogo.com, O="Xxxxxxxxc Xxxx, Inc.", L=Redwood City, S=California, C=US
-- 但是加上subject和issuer的时候,就抱错如下:
先创建用户:
GRANT all privileges ON *.* TO 'sss'@'localhost'
  IDENTIFIED BY 'goodsecret'
  REQUIRE SSL and SUBJECT '/CN=nuc-bbbmysql-admin.nucleus.XX.com/OU=XX Online/Pogo.com/O="Xxxxxxxxc Xxxx, Inc."/S=California/C=US'
  and issuer '/E=wwtso-ssl-admins@XX.com/CN="Xxxxxxxxc Xxxx, In
  c CA"/OU=XX Online/Pogo.com/O="Xxxxxxxxc Xxxx, Inc."/L=Redwood City/S=California/C=US';
在客户端登陆:
[aaaaaaaaaaa@XXnintmydbc000ctl ssl]$   /opt/mysql/product/mysql/bin/mysql -hXXcccmysql.abn-iad.XX.com -utest -ptest --ssl-ca=/home/aaaaaaaaaaa/ssl/ca-cert.pem --ssl-cert=/home/aaaaaaaaaaa/ssl/server-cert.pem --ssl-key=/home/aaaaaaaaaaa/ssl/server-key.pem
ERROR 1045 (28000): Access denied for user 'test'@'XXnintmydbc000ctl.abn-iad.XX.com' (using password: YES)

db server端error日志保错如下:
130722  9:25:04 [Note] X509 issuer mismatch:
should be 'E=wwtso-ssl-admins@XX.com/CN="Xxxxxxxxc Xxxx, Inc CA"/OU=XX Online/Pogo.com/O="Xxxxxxxxc Xxxx, Inc."/L=Redwood City/S=California/C=US'
but is '/C=US/ST=California/L=Redwood City/O=Xxxxxxxxc Xxxx, Inc./OU=XX Online/Pogo.com/CN=Xxxxxxxxc Xxxx, Inc CA/emailAddress=wwtso-ssl-admins@XX.com'
 


3 看到client端的issuer和server端的issuer mismatch,所以为了测试成功,直接修改grant语句吧,再次进行测试,如下,drop user然后再grant帐号
  drop user 'test'@'%';
  GRANT all privileges ON *.* TO 'test'@'%'
  IDENTIFIED BY 'test'
  REQUIRE SUBJECT '/CN=nuc-bbbmysql-client.nucleus.XX.com/OU=XX Online/Pogo.com/O="Xxxxxxxxc Xxxx, Inc."/S=California/C=US'
  and issuer '/C=US/ST=California/L=Redwood City/O=Xxxxxxxxc Xxxx, Inc./OU=XX Online/Pogo.com/CN=Xxxxxxxxc Xxxx, Inc CA/emailAddress=wwtso-ssl-admins@XX.com' ;


客户端登陆mysql db server,依然报错如下:
[ddddmysqlprd@XXnprdmydbctl client-cert]$   /opt/mysql/product/mysql/bin/mysql -hXXcccmysql.abn-iad.XX.com -utest -ptest --ssl-ca=/home/ddddmysqlprd/client-cert/ca-cert.pem --ssl-cert=/home/ddddmysqlprd/client-cert/client-cert.pem --ssl-key=/home/ddddmysqlprd/client-cert/client-key.pem
ERROR 1045 (28000): Access denied for user 'test'@'XXnprdmydbctl.XXo.abn-iad.XX.com' (using password: YES)
再check error日志
  130722  9:29:15 [Note] X509 subject mismatch:
  should be '/CN=nuc-bbbmysql-client.nucleus.XX.com/OU=XX Online/Pogo.com/O="Xxxxxxxxc Xxxx, Inc."/S=California/C=US'
  but is '/C=US/ST=California/O=Xxxxxxxxc Xxxx, Inc./OU=XX Online/Pogo.com/CN=nuc-bbbmysql-client.nucleus.XX.com'


 4 看到client与server的subject不一致,所以直接将提示error中的subject里面的替换下,再测试
 
 drop user,然后grant user;

   drop user 'test'@'%';
  GRANT all privileges ON *.* TO 'test'@'%'
  IDENTIFIED BY 'test'
  REQUIRE SUBJECT '/C=US/ST=California/O=Xxxxxxxxc Xxxx, Inc./OU=XX Online/Pogo.com/CN=nuc-bbbmysql-client.nucleus.XX.com'
  and issuer '/C=US/ST=California/L=Redwood City/O=Xxxxxxxxc Xxxx, Inc./OU=XX Online/Pogo.com/CN=Xxxxxxxxc Xxxx, Inc CA/emailAddress=wwtso-ssl-admins@XX.com' ;   drop user 'test'@'%';
  GRANT all privileges ON *.* TO 'test'@'%'
  IDENTIFIED BY 'test'
  REQUIRE SUBJECT '/C=US/ST=California/O=Xxxxxxxxc Xxxx, Inc./OU=XX Online/Pogo.com/CN=nuc-bbbmysql-client.nucleus.XX.com'
  and issuer '/C=US/ST=California/L=Redwood City/O=Xxxxxxxxc Xxxx, Inc./OU=XX Online/Pogo.com/CN=Xxxxxxxxc Xxxx, Inc CA/emailAddress=wwtso-ssl-admins@XX.com' ;


 然后在客户端登陆
[ddddmysqlprd@XXnprdmydbctl client-cert]$   /opt/mysql/product/mysql/bin/mysql -hXXcccmysql.abn-iad.XX.com -utest -ptest --ssl-ca=/home/ddddmysqlprd/client-cert/ca-cert.pem --ssl-cert=/home/ddddmysqlprd/client-cert/client-cert.pem --ssl-key=/home/ddddmysqlprd/client-cert/client-key.pem
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 25289
Server version: 5.5.25a-log MySQL XX RelXXse

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clXXr the current input statement.

mysql>
mysql>
mysql>
mysql>
mysql> exit
Bye

OK,i did it。

然后觉得同事给我的subject和issuer有问题,跟同事在server端创建的server key有出入,
最后检查问题出在windown环境和linux环境之间的差异,同事给的一些参数是window下的,所以linux下不识别,比如email参数等。
不过这些也没有关系,我们只要关注error日志,看报错信息然后依据报错信息一步步调试,都可以确保功能测试通过。
 

 

 

 

<think>好的,我现在需要回答用户关于OpenSSLX509_get_issuer_nameX509_get_subject_name函数用法的问题。首先,我得确认这两个函数的具体作用参数。用户可能想知道如何正确调用它们,以及如何从X509证书结构中获取颁发者主题名称。 我记得在OpenSSL库中,X509结构代表一个X.509证书。X509_get_issuer_name函数应该返回证书的颁发者名称,也就是颁发该证书的实体。而X509_get_subject_name则是获取证书的主题名称,即证书持有者的信息。这两个函数都接受一个X509指针作为参数,返回一个X509_NAME指针。 接下来,我需要考虑如何展示示例代码。用户提供的引用中有几个相关的例子,比如引用[2]引用[4]。比如引用[2]中的代码展示了使用X509_get_subject_name获取主题名称,并通过X509_NAME_get_text_by_NID提取特定字段。这可能是一个好的参考点。 用户可能需要一个完整的示例,包括如何解析证书,然后使用这两个函数获取信息。考虑到证书的来源,可能需要从文件或内存中加载证书。引用[4]展示了从内存解析证书的方法,使用d2i_X509函数。而引用[3]提到了使用PEM_read_bio_X509来解析PEM格式的证书。所以可能需要展示两种不同的加载方式,或者选择其中一种作为示例。 另外,需要注意内存管理,比如使用X509_free释放资源。在示例代码中需要包含错误处理,例如检查返回的指针是否为NULL,避免崩溃。 用户还可能想知道如何将X509_NAME结构中的信息转换为可读的字符串。引用[2]中的例子使用了X509_NAME_get_text_by_NID来获取特定字段的文本,比如通用名称。但这种方法可能不够全面,因为证书可能包含多个字段。另一种方法是将整个X509_NAME结构转换为字符串,使用X509_NAME_oneline函数,或者更复杂的打印函数,比如X509_NAME_print_ex。 在编写示例代码时,需要确保语法正确,包括正确的头文件引用函数调用顺序。比如需要包含openssl/x509.hopenssl/bio.h等头文件。 另外,用户可能对这两个函数返回的数据结构生命周期有疑问,是否需要手动释放?根据OpenSSL文档,X509_NAME结构是内部管理的,不需要单独释放,因为它们属于X509证书结构的一部分,当调用X509_free时会自动处理。 最后,要生成相关问题,可能需要围绕证书解析、其他X509函数的使用、错误处理或内存管理等方面提问,确保问题与主题相关,并帮助用户深入学习。</think>### OpenSSLX509_get_issuer_name与X509_get_subject_name函数用法 #### 函数说明 1. **`X509_get_issuer_name`** 返回X.509证书的颁发者(Issuer)名称,即签发该证书的实体信息,类型为`X509_NAME*`。 2. **`X509_get_subject_name`** 返回X.509证书的主题(Subject)名称,即证书持有者的信息,类型为`X509_NAME*`[^2]。 --- #### 示例代码(解析证书并提取信息) ```c #include <openssl/x509.h> #include <openssl/bio.h> void print_cert_info(const X509 *cert) { // 获取颁发者名称 X509_NAME *issuer = X509_get_issuer_name(cert); if (issuer) { char issuer_buf[256]; X509_NAME_oneline(issuer, issuer_buf, sizeof(issuer_buf)); printf("颁发者: %s\n", issuer_buf); } // 获取主题名称 X509_NAME *subject = X509_get_subject_name(cert); if (subject) { char subject_buf[256]; X509_NAME_oneline(subject, subject_buf, sizeof(subject_buf)); printf("主题: %s\n", subject_buf); } } // 示例:解析PEM格式证书文件 int main() { BIO *bio = BIO_new_file("cert.pem", "r"); X509 *cert = PEM_read_bio_X509(bio, NULL, NULL, NULL); if (!cert) { fprintf(stderr, "证书解析失败\n"); BIO_free(bio); return 1; } print_cert_info(cert); X509_free(cert); BIO_free(bio); return 0; } ``` #### 关键点 1. **参数与返回值** - 函数参数为`X509*`类型,表示证书对象。 - 返回的`X509_NAME*`无需手动释放,其生命周期与证书对象绑定[^4]。 2. **数据提取方法** - 使用`X509_NAME_oneline`将名称转换为单行字符串。 - 通过`X509_NAME_get_text_by_NID`可提取特定字段(如通用名称、国家代码)[^2]。 3. **内存管理** - 必须调用`X509_free`释放证书对象[^4]。 --- #### 典型输出 ```plaintext 颁发者: /C=US/O=Example CA/CN=CA Root 主题: /C=CN/O=Test Org/CN=example.com ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值