web-dev-qa-db-ja.com

CAで証明書に署名する

実行中:

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

私は得る:

StateOrProvinceNameフィールドは、CA証明書(Gloucestershire)と要求(Gloucestershire)で同じである必要がありました

エラーを数回読んだことがありますが、各ケースでフィールドが同じ値であると確信しています。異なるエンコーディングによって引き起こされる同様の問題への参照を見つけましたが、それをどこでどのように指定する必要があるのか​​わかりません。

これは$ {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-----

何か案は?前もって感謝します。

44
rich

私もこの問題に遭遇しました。上記の回答(主にフランソワ)のおかげで、問題の原因を発見しました。

opensslはUTF8STRINGを使用してエンコードし、keytool(Java 6)はPRINTABLESTRINGを使用してエンコードします。

Keytoolに一致するようにopenssl構成を変更することにより、この問題を回避しました。 /usr/ssl/openssl.cnfで、「string_mask」設定を「pkix」に変更します。

24
Reg Whitton

オプションとして属性を設定することもできます。

# For the CA policy

[policy_match]
countryName= optional
stateOrProvinceName= optional
organizationName= optional
organizationalUnitName= optional
commonName= supplied
emailAddress= optional
41
Yogesh Chawla

以前のポスターはすでに質問に答えていましたが、簡単にするために、エンコードの指定方法の例を次に示します。 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
17
MacFreek

によって示されるように:

openssl asn1parse -in req.csr  

要求DN文字列はPRINTABLESTRINGとしてエンコードされます。

openssl asn1parse -in cacert.pem 

は、CA DN文字列がUTF8STRINGとしてエンコードされていることを示しています。

クイックアンドダーティハックの場合、お気に入りの16進エディターを使用して、PRINTABLESTRINGのエンコードタイプ(0x13)をUTF8STRINGのタイプ(0x0c)に置き換えることにより、リクエストの文字列のエンコードを変更することをお勧めします。
突く前に、DERでリクエストを変換する必要があります。
変更するバイトのオフセットは、以下で見つけることができます。

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

その後、再度署名してください。

9
Francois

mbrownnycのコメント を回答にプロモートする。

/usr/ssl/openssl.cnfには、上記の設定を含むpolicy_anythingというポリシーが含まれていると思います。次のようにpolicy引数を使用して使用できます。

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

私はちょうどこの問題に出くわしました。根本的な原因は、クライアントのstring_maskとCAのopenssl.cnfの値の不一致です。簡単な修正方法は、CAが期待するものに一致するようにクライアントの値を変更し、CSRを再生成することです。ハードフィックスは、CAの値を編集し、新しいCAを開始することです。

6
divestoclimb