- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 OpenSSL C API 构建 CSR。代码如下:
static void seedPRNG() {
const int openSSLseedsize = 128;
uint8_t *openSSLseed = NULL;
openSSLseed = malloc(openSSLseedsize * sizeof(uint8_t));
//printf("%d\n\n", openSSLseedsize);
// random number generator
SecRandomCopyBytes(kSecRandomDefault, openSSLseedsize, openSSLseed);
for (unsigned i = 0; i < openSSLseedsize; i++) {
printf("%d", openSSLseed[i]);
}
printf("\n\n\n\n");
//seed openSSL random
RAND_seed(openSSLseed, 128);
}
// Parameter settings for this cert
//
#define RSA_KEY_SIZE (2048)
#define ENTRIES 3
// array of entries to assign to cert
struct entry {
char *key;
char *value;
};
struct entry entries[ENTRIES] =
{
{"emailAddress", "tomgrant@example.com"},
{"commonName", "internal.example.com"},
{"countryName", "GB"},
};
// Generate CSR
int generateCSR() {
int i;
RSA *rsakey;
X509_REQ *req;
X509_NAME *subj;
EVP_PKEY *pkey;
EVP_MD *digest;
FILE *fp;
// set up OpenSSl
OpenSSL_add_all_algorithms();
ERR_load_CRYPTO_strings();
// seed oppenssl's prng
seedPRNG();
// generate RSA key (no callback for progress - it's quick enough)
// RSA_F4 is 0x10001 (or 65537) for the exponent.
// RSA docs say exponent should be either 3, 5, 17, 257 or 65537 i.e. prime numbers. See here for further info:
// http://security.stackexchange.com/questions/2335/should-rsa-public-exponent-be-only-in-3-5-17-257-or-65537-due-to-security-c
rsakey = RSA_generate_key(RSA_KEY_SIZE, RSA_F4, NULL, NULL);
if (rsakey == NULL) {
fatal("Could not create RSA key");
}
// Create EVP ("Envelope Encryption" apparently...) object to hold our rsakey
// generate private key
if (!(pkey = EVP_PKEY_new()))
fatal("Could not create EVP object");
// assign the rsa key to EVP object
if (!(EVP_PKEY_set1_RSA(pkey, rsakey)))
fatal("Could not assign RSA key to EVP object");
// create request object
if (!(req = X509_REQ_new()))
fatal("Failed to create X509_REQ object");
// set the public key
X509_REQ_set_pubkey(req, pkey);
// create and fill in subject object
if (!(subj = X509_NAME_new()))
fatal("Failed to create X509_NAME object");
for (i = 0; i < ENTRIES; i++)
{
// create nid for every entry
int nid; // ASN.1 numeric ID - ASN.1 = Abstract Syntax Notation One. Formal notation used to describe data transmitted by telecommunications protocols.
// The NID is a unique internal ID assigned to every object.
X509_NAME_ENTRY *ent;
if ((nid = OBJ_txt2nid(entries[i].key)) == NID_undef)
{
fprintf(stderr, "Error finding NID for %s\n", entries[i].key);
fatal("Error on lookup");
}
if (!(ent = X509_NAME_ENTRY_create_by_NID(NULL, nid, MBSTRING_ASC, (unsigned char*)entries[i].value, -1)))
fatal("Error creating Name entry from NID");
if (X509_NAME_add_entry(subj, ent, -1, 0) != 1)
fatal("Error adding entry to Name");
}
if (X509_REQ_set_subject_name(req, subj) != 1)
fatal("Error adding subject to request");
// request is filled in and contains our generated public key
// now sign it
digest = (EVP_MD *)EVP_sha1();
if (!(X509_REQ_sign(req, pkey, digest)))
fatal("Error signing request");
// write output files
//
NSString *docDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
// append file name
NSString *crtPath = [docDirectory stringByAppendingString:@"/example.crt"];
NSLog(@"crtPath = %@", crtPath);
if (!(fp = fopen([crtPath UTF8String], "w")))
fatal("Error writing to request file");
if (PEM_write_X509_REQ(fp, req) != 1)
fatal("Error writing request");
fclose(fp);
NSString *keyPath = [docDirectory stringByAppendingString:@"/example.key"];
NSLog(@"keyPath = %@", keyPath);
if (!(fp = fopen([keyPath UTF8String], "w")))
fatal("Error writing to private key file");
if (PEM_write_PrivateKey(fp, pkey, NULL, NULL, 0, 0, NULL) != 1)
fatal("Error while writing private key");
fclose(fp);
X509_REQ_print_fp(stdout, req);
EVP_PKEY_free(pkey);
X509_REQ_free(req);
return 0;
}
这会创建一个 CSR 并输出私钥。我可以使用在线 CSR 检查器来验证 CSR,它会全面显示它是正确的。我正在使用 Windows 2008R2 CA 粘贴 base64 CSR。但是,当我提交请求时,Windows 框会返回以下错误:
您的请求 ID 是 0。处置消息是“Error Parsing Request ASN1 bad tag value met. 0x8009310b (ASN: 267)”。
当使用开放式 SSL 附带的 mkreq.c 示例代码生成 CSR 时,也会发生这种情况。
有没有人遇到过这个?我的在线研究只发现人们从 CA(GoDaddy 等)颁发的时髦证书中得到这个错误。
如有任何帮助,我们将不胜感激!
最佳答案
(由 OP 在编辑中回答。参见 Question with no answers, but issue solved in the comments (or extended in chat))
OP 写道:
Well - my colleague and I FINALLY found a solution.
Looking at the ASN.1 representation (using openssl asn1parse), we noticed the BAD CSR had this representation:
8:d=2 hl=2 l= 0 prim: INTEGER :00
Notice the l = 0 (I guess this means length). Then a GOOD CSR:
8:d=2 hl=2 l= 1 prim: INTEGER :00
Notice l = 1
This is fixed by setting the version number of the CSR (the RFP says it should be set to 0).
So - using X509_REQ_set_version(req, 0); has fixed things and server 2008R2 gives me my beloved identity!
关于c - Windows 2008R2 CA 和 OpenSSL CSR : Error parsing CSR ASN1 bad value met,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15294964/
我想使用 asn.1 实现一些协议(protocol),所以我必须在一些头文件中声明结构和标记名称,并将 asn.1 的编码规则作为函数实现。 你能给我推荐一些教程或书来引用吗? 我不知道如何为它编写
我正在寻找非常通用、严格且与平台无关的序列化框架。我发现了一个叫做 ASN.1 的东西。 它看起来像与序列化有关的东西,但我实际上无法理解它是什么。我阅读了维基百科文章和 ITU article但仍然
这些编码在 ASN.1 INTEGER 类型中是否相同? 编码十进制 10 02 01 0A 02 02 00 0A 02 03 00 00 0A ... 最佳答案 我假设您正在使用 BER。 INT
一个 ASN.1 标签由两个类位组成,一个是形式位和一个标签号。我的问题是:标签唯一性是什么就足够了?是否足够,类和编号是唯一的,还是还需要包含标签形式?或者反过来:是否有两个不同的标签具有相同的标签
这是一个用 ASN.1 DER 编码的证书示例 30 82 01 8F 30 81 F9 **A0** 03 02 01 02 02 01 01 30 0D 06 09 2A 86 48 86 F7
这是一个用 ASN.1 DER 编码的证书示例 30 82 01 8F 30 81 F9 **A0** 03 02 01 02 02 01 01 30 0D 06 09 2A 86 48 86 F7
我收到了一份 ASN.1 文档,其中包含两个编码/解码属性; 自动标签 我的理解;标签是使用编码规则自动定义的,除非定义中存在标签符号 隐含的可扩展性 我的理解;类型可能包含 ASN.1 文档中未定义
我收到了一份 ASN.1 文档,其中包含两个编码/解码属性; 自动标签 我的理解;标签是使用编码规则自动定义的,除非定义中存在标签符号 隐含的可扩展性 我的理解;类型可能包含 ASN.1 文档中未定义
我的服务器使用 ASN.1 生成的类接收一个 Integer BerInputStream in = new BerInputStream(socket.getInputStream());
我正在尝试在我的 .bashrc 配置文件中使用以下别名: alias ip2asn="IP=$(dig $1 a +short);whois -h v4.whois.cymru.com " -v $
我正在阅读 PKCS #7 ASN.1 定义,并遇到了这种类型。我似乎无法找出 {{Authenticated}} 在此代码中做了什么,或者这将被称为什么产品。我还在 PKCS #8 标准中看到了 {
例如根据 http://luca.ntop.org/Teaching/Appunti/asn1.html一个序列具有十六进制的标记号 10。 但是为什么 DER 编码为 30 而不是 10?带有十六进
我有以下 BERTLV: 61394F0BA00000030800001001234579074F05A000012345500E49442D4F6E65205049562042494F5F50107
为什么模数用前导零填充?我正在阅读 PKCS#1 和 PKCS#8,但没有找到任何相关信息。 在 c# 中必须删除前导零,有人知道为什么吗? 在 http://etherhack.co.uk/asym
我正在尝试使用通信协议(protocol)(具体来说是 S1AP),并且我正在尝试定义要测试的消息。 LTE 36.413 规范详细介绍了该协议(protocol),并在 pdf 的底部给出了 ASN
我正在解码 ASN.1 格式的 X.509 证书。我成功解码了它,遍历了结构,但有一件事我不明白。 在某些情况下,我会得到一个八位字节字符串,而我正在使用的这个网站 ( http://lapo.it/
使用抽象语法表示法声明 IpAddress: IpAddress ::= [APPLICATION 1] INTEGER (0..4294967295) 这段代码中的[APPLICATION 1]是什
我无法理解 ASN.1 的基本概念。 如果类型是 OID,相应的数字是否实际编码在二进制数据中? 例如在此定义中: id-ad-ocsp OBJECT IDENTIFIER ::= {
我需要创建一个包含多条记录的 ASN.1 BER 编码文件。我一直在寻找一个(oss、asn1c、...等工具),但我找不到一个适合我的完整示例,说明如何在一个文件中编码多条记录。 有谁知道一个好工具
使用抽象语法表示法声明 IpAddress: IpAddress ::= [APPLICATION 1] INTEGER (0..4294967295) 这段代码中的[APPLICATION 1]是什
我是一名优秀的程序员,十分优秀!