2011-08-07 108 views
40

上运行:签名的证书和我的CA

openssl ca -in ${ALIAS}.csr -out user-cert.pem -keyfile cacert-private.pem -cert cacert.pem -passin pass:$PASSWD -config ${CONFIG} 

我得到:

是 CA证书(格洛斯特郡),并要求在同一所需要的stateOrProvinceName场(格洛斯特郡)

我已经读了几次错误,我很确定这个字段在每种情况下都是相同的值。我发现引用了由不同编码导致的类似问题,但我不知道应该如何指定它以及在哪里。

这是$ {ALIAS} .csr文件:

-----BEGIN NEW CERTIFICATE REQUEST----- 
MIICxzCCAa8CAQAwgYExCzAJBgNVBAYTAkdCMRgwFgYDVQQIEw9HbG91Y2VzdGVyc2hpcmUxEzAR 
BgNVBAcTCkNoZWx0ZW5oYW0xHzAdBgNVBAoTFldhbnNkeWtlIEhvdXNlIExpbWl0ZWQxDjAMBgNV 
BAsTBUZpemlvMRIwEAYDVQQDEwlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK 
AoIBAQDWvivt1JHiuaNeadOQJtxynQ4sSAR/peWgKd8g9UQgNM+H9QW4NlRE81+g63BdRqZT5YMm 
J4K3upovQNlDRklevslgEYoTdQM4yBKV676Q4XDbM7Vk+rt04sqL5IgdsAUXODfMJvu81t3tOjFc 
OGO7S+B+LEJ1+8qshLbuK2gBigfgcZtlbNgW6fCGik8ZsrKWl8W+NFbw1seS01INAipwCBasxaaj 
/lINwWQVbQIG09+vEdwuHmmq5VIKlJqFcYNUTFBVojoJLfzyStZR2PfFUxp7R+t2YmVj6a48B7NA 
lODnIlQDkAprECNMpCZoSP1QjrZgW1BgaVbT5OaWlVsPAgMBAAGgADANBgkqhkiG9w0BAQUFAAOC 
AQEAvalFyJOgzmd1jcFlS5YoqiNgX1bm9nZ0/cFgj6cGL7R0Gqc9wu5QPakWRxa9c2UcI0m7p1lp 
cygDvQTY23LEBhVcruymIGQG5DhDpXHeaBCbV3OWO6xowAjh+riQjvTNeVSXtP3jUNs5DaId0z+A 
GXeb7dR96jhyj+soNYENoQseQLqLdAW4p0jdK1BraMJTc0ber0FBx1nOUXOEoTIJL9kL9cUWaCp3 
7uYkonIPtVCCfS8KcgXxUsNMC41q/SkKDVB23PeCjnWgcyXxnSpx8n+AK7fwMgh+4TcZ5usmVujR 
MNqk84hZpw8h1FIcmqRaWtaPWyv3EX8JH5LTnDe3eQ== 
-----END NEW CERTIFICATE REQUEST----- 

而且cacert.pem:

-----BEGIN CERTIFICATE----- 
MIIDQDCCAqmgAwIBAgIJAPj9mvMDl1K/MA0GCSqGSIb3DQEBBQUAMIG4MQswCQYD 
VQQGEwJHQjEYMBYGA1UECAwPR2xvdWNlc3RlcnNoaXJlMRMwEQYDVQQHDApDaGVs 
dGVuaGFtMR8wHQYDVQQKDBZXYW5zZHlrZSBIb3VzZSBMaW1pdGVkMQ4wDAYDVQQL 
DAVGaXppbzESMBAGA1UEAwwJbG9jYWxob3N0MTUwMwYJKoZIhvcNAQkBFiZyaWNo 
YXJkLm1pZHdpbnRlckB3YW5zZHlrZS1ob3VzZS5jby51azAeFw0xMTA4MDcyMTU4 
NDBaFw0yMTA4MDQyMTU4NDBaMIG4MQswCQYDVQQGEwJHQjEYMBYGA1UECAwPR2xv 
dWNlc3RlcnNoaXJlMRMwEQYDVQQHDApDaGVsdGVuaGFtMR8wHQYDVQQKDBZXYW5z 
ZHlrZSBIb3VzZSBMaW1pdGVkMQ4wDAYDVQQLDAVGaXppbzESMBAGA1UEAwwJbG9j 
YWxob3N0MTUwMwYJKoZIhvcNAQkBFiZyaWNoYXJkLm1pZHdpbnRlckB3YW5zZHlr 
ZS1ob3VzZS5jby51azCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA03Y4hYdd 
at3e3AB98s+E5wlxrvRL8RhJtRac0Jt0gXQy12ZYziFm3gryx0IG02srXluM+V3/ 
BPRRCLsnEnltfoi/fE0wM9MT0V1Ao9EXQ5t1E2rOzdoXUUdvovd6qvwG2L/DHCdL 
kKjhokVR9TkFW/AWctBdWkb9qfFFTpDY4i0CAwEAAaNQME4wHQYDVR0OBBYEFHbG 
d3+Lzax90slk65y1BYDgZ897MB8GA1UdIwQYMBaAFHbGd3+Lzax90slk65y1BYDg 
Z897MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEArZ2yfTGJK3R+jRwP 
FjaonDy1NVOt9tgjHfyh9YNQfyFSC7R987wFPcyydEqh8xg/Lb3WGwseDuzCBusw 
jmVIqiUYBClHzkF3jG1766ltdlVVTOavVQgQMRBGMvpHVxcMH2RUNUyWH0XW+DH2 
/uuRRpu4vX5sfEW75uEfORB9Mrg= 
-----END CERTIFICATE----- 

任何想法?提前致谢。

+0

您可以发布相关的PEM文件(当然除了密钥文件)吗? – emboss

+0

谢谢。希望我已经添加了正确的,如果有一个关键文件,他们只是测试。 – rich

+0

这个编程有关吗? – jweyrich

回答

24

我也碰到了这个问题。由于上面的答复(主要是弗朗索瓦),我发现了问题的根源。

openssl使用UTF8STRING编码,而keytool(Java 6)使用PRINTABLESTRING编码。

通过更改openssl配置,使其与keytool匹配来解决此问题。在/usr/ssl/openssl.cnf中,将“string_mask”设置更改为“pkix”。

+3

不适合我 –

9

如图所示的条件:

openssl asn1parse -in req.csr 

请求DN串被编码为,可打印。

openssl asn1parse -in cacert.pem 

显示CA DN字符串编码为UTF8STRING。

对于quick'n肮脏的黑客攻击,我建议你改变你的请求中的字符串编码,通过UTF8STRING(0x0c)的类型替换PRINTABLESTRING(0x13)的编码类型,使用你最喜欢的十六进制编辑器。
您必须先在DER中转换您的请求,然后再戳它。

openssl asn1parse -in csr |grep PRINTABLESTRING |awk -F":" '{print $1}' 

然后尝试重新登录:
字节改变的偏移可以被发现。

+0

您是否可以执行任何'awk'体操来完成这个任务? – mbrownnyc

+0

您不能在签名时更改CSR中的字节。 – miken32

6

我刚碰到这个问题。根本原因是客户端中的string_mask和CA的openssl.cnf的值不匹配。简单的解决方法是修改客户端的值以符合CA的期望,然后重新生成CSR。难以解决的问题是编辑CA的价值并开始新的CA.

14

以前的海报已经回答了这个问题,但为了更容易,下面是一个如何指定编码的例子。使用string_mask:

[ req ] 
default_bits   = 2048 
default_md    = rsa 
prompt     = no 
string_mask    = utf8only # <-------------- 
distinguished_name  = req_distinguished_name 

[ req_distinguished_name ] 
countryName    = GB 
stateOrProvinceName  = Gloucestershire 
localityName   = Cheltenham 
organizationName  = Wansdyke House Limited 
organizationalUnitName = Fizio 
commonName    = localhost 
40

您还可以设置属性为可选:

​​
+15

我相信'/ usr/ssl/openssl.cnf'包含一个名为'policy_anything'的策略,其中包含上述设置。你可以通过使用'policy'参数来使用它,如下所示:'openssl ca -policy policy_anything -days 365 -out /root/ca/certs/out.pem -in certreq.csr' – mbrownnyc

+1

'policy_anything'为我做了诀窍。绝对是一种比摆弄CSR位或OpenSSL配置更方便的方法。 – arcain

+0

如果你想默认使用'policy_anything',你可以将你的配置更新到'policy = policy_anything',如果你需要的话可以使用'-policy policy_match'(或者你可以创建自己的默认策略) – STW

7

mbrownnyc's comment提升为答案,因为它对我很有用,值得更多关注。

我相信/usr/ssl/openssl.cnf包含一个叫做policy_anything的政策,其中包含上述设置。您可以使用policy参数如下:

openssl ca -policy policy_anything -days 365 -out /root/ca/certs/out.pem -in certreq.csr 
+0

你确定它应该是一个单独的答案吗? –

+1

我这么认为。它提供了一个解决问题的简单方法。 – legoscia