2011-08-07 109 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