当我发出以下命令时:
cn[(sizeof cn) - 1] = 0;
if (X509_NAME_get_text_by_NID(subj_p, NID_commonName,
cn, (sizeof cn) - 1) <= 0) {
fprintf(stderr, "Subject has no CN\n");
return -1;
}
if (strncasecmp(cn, options.server_p, sizeof cn) != 0) {
fprintf(stderr, "Subject CN mismatch (%s != %s)\n",
options.server_p, cn);
return -1;
}
其中
options.server_p
是a1.accessmylan.com
我收到以下错误:
Subject CN mismatch (b1.accessmylan.com != BONE.ACCESSMYLAN.COM)
如果我尝试使用其他服务器,则会得到:
Subject CN mismatch (a1.accessmylan.com != aone.ACCESSMYLAN.COM)
有人知道为什么会发生这种情况和/或如何解决吗?谢谢!
最佳答案
如您所显示的错误,这两个通用名称确实不同。它们在任何意义上都不相同。
据我所知,通用名称b1.accessmylan.com和BONE.ACCESSMYLAN.COM实际上是不同的。
请检查您的证书及其通用名称并输入。
在你的代码中
cn[(sizeof cn) - 1] = 0;
您正在使用sizeof来计算cn的元素数。 sizeof运算符给出字节数,而不是元素数。
正确的方法(如果cn在作用域中声明为静态数组)
cn[sizeof(cn)/sizeof(cn[0]) - 1] = 0;
这可能是问题之一,但不一定是这个问题。
另一件事是,在您的代码中,在strcasecmp中,您正在传递cn的大小。作为一种好习惯,您应该传递cn或options.server_p中较小的一个。