- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 OpenSSL 中的 API 生成 x509 证书。我首先像这样创建 X509 结构:
X509 *x509 = X509_new(); // Assume no errors
现在我想为这个证书添加一个扩展。具体来说,我想将“Extended Key Usage”扩展设置为值 serverAuth,clientAuth
。为此,我尝试使用 OpenSSL 函数 x509_add1_ext_i2d()
,它具有以下签名:
X509_add1_ext_i2d(X509 *x, int nid, void *value, int crit, unsigned long flags)
我正在调用该函数,为 value
传递一个 C 字符串,我认为这是不正确的。这是我正在调用的电话:
X509_add1_ext_i2d(x509, NID_ext_key_usage, "serverAuth,clientAuth", 0, 0)
当该行代码运行时,我收到了 EXC_BAD_ACCESS (code=EXC_i386_GPFLT)
异常。我假设这是因为我传入的 value
必须是某种特殊的东西(八位字节字符串?某种其他 OpenSSL 值?)
我需要为 value
参数传递什么才能正确地将扩展设置为字符串值 serverAuth,clientAuth
?或者,为什么我会得到列出的异常?注意:如果我删除此行并尝试生成不带扩展名的证书(具有其他属性,例如名称、到期日期等,为简洁起见,我已在此处排除)它工作得很好。
我花了一整天的时间浏览 OpenSSL(非常糟糕)的文档和谷歌搜索。我能找到的所有内容都讨论了如何从命令行而不是代码向证书添加扩展。我无法追踪此函数到底希望在 value
参数中看到什么。
最佳答案
在深入了解 OpenSSL 的源代码之后,我偶然发现了 makecert.c
示例中的一个函数,它也执行此操作。我稍微清理了一下,就在这里。您传入要设置的扩展的 NID 和一个简单的字符串值。非常方便:
BOOL addExtension(X509 *cert, int nid, char *value)
{
X509_EXTENSION *ex = NULL;
X509V3_CTX ctx;
// This sets the 'context' of the extensions. No configuration database
X509V3_set_ctx_nodb(&ctx);
// Issuer and subject certs: both the target since it is self signed, no request and no CRL
X509V3_set_ctx(&ctx, cert, cert, NULL, NULL, 0);
ex = X509V3_EXT_conf_nid(NULL, &ctx, nid, value);
if (!ex) {
return NO;
}
int result = X509_add_ext(cert, ex, -1);
X509_EXTENSION_free(ex);
return (result == 0) ? YES : NO;
}
关于objective-c - OpenSSL x509 证书 : Add Extension with X509_add1_ext_i2d(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35616853/
我创建了一个元表,其中 __add 和 __sub 使用一个表和一个数字。 Lua 如何确定使用哪一个?考虑以下两种情况,表 T(描述了元表) local n=-10 local V=T+n 和 lo
遇到麻烦,服务端程序运行一段时间后,会出现大量错误(error),服务端只能接受客户端连接不接受数据,最后暂停动画。出现以下错误: //report error: //report error: Un
我是一名优秀的程序员,十分优秀!