使用我的CA签署证书

运行时:

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

我得到:

stateOrProvinceName字段需要在CA证书(格洛斯特郡)和请求(格洛斯特郡)中相同,

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

这是$ {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----- 

有任何想法吗? 提前致谢。

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

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

通过改变opensslconfiguration,使其与keytool相匹配。 在/usr/ssl/openssl.cnf中,将“string_mask”设置更改为“pkix”。

您也可以将这些属性设置为可选:

 # For the CA policy [policy_match] countryName= optional stateOrProvinceName= optional organizationName= optional organizationalUnitName= optional commonName= supplied emailAddress= optional 

以前的海报已经回答了这个问题,但是为了更容易,下面是一个如何指定编码的例子。 使用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 

如下所示:

 openssl asn1parse -in req.csr 

请求的DNstring被编码为PRINTABLESTRING。

 openssl asn1parse -in cacert.pem 

显示CA DNstring编码为UTF8STRING。

对于一个肮脏的黑客攻击,我build议你通过UTF8STRING(0x0c)的typesreplacePRINTABLESTRING(0x13)的编码types,使用你最喜欢的hex编辑器来改变请求中string的编码。
你必须在DER之前转换你的请求。
要更改的字节偏移量可以在以下位置find:

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

然后尝试再次签名。

将mbrownnyc的评论推荐给一个答案,因为这对我有用,值得更多的关注。

我相信/usr/ssl/openssl.cnf包含一个名为policy_anything的策略,其中包含上述设置。 您可以通过使用policy参数来使用它,如下所示:

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

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