Certificate 使用我的CA签署证书

Certificate 使用我的CA签署证书,certificate,openssl,Certificate,Openssl,运行时: openssl ca -in ${ALIAS}.csr -out user-cert.pem -keyfile cacert-private.pem -cert cacert.pem -passin pass:$PASSWD -config ${CONFIG} 我得到: 中的stateOrProvinceName字段必须相同 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 asn1parse -in req.csr  
请求DN字符串编码为PRINTABLESTRING

openssl asn1parse -in cacert.pem 
显示CA DN字符串编码为UTF8STRING

对于快速的恶意攻击,我建议您使用您最喜欢的十六进制编辑器,将PRINTABLESTRING(0x13)的编码类型替换为UTF8STRING(0x0c)的编码类型,从而更改请求中字符串的编码。
在插入请求之前,您必须将其转换为DER。
要更改的字节偏移量可以通过以下方式找到:

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

然后再次尝试签名。

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

前面的海报已经回答了这个问题,但为了更简单,下面是一个如何指定编码的示例。使用字符串掩码:

[ 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
[req]
默认_位=2048
默认值\u md=rsa
提示=否

string_mask=utf8only#您还可以将属性设置为可选:

# For the CA policy

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

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

openssl使用UTF8STRING编码,keytool(Java6)使用PRINTABLESTRING编码

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

升级为答案,因为它对我很有用,值得更多关注


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

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

你可以发布相关的PEM文件(当然除了密钥文件)吗?谢谢。希望我已经添加了正确的,如果那里有一个密钥文件,那么它们只是测试文件。是的,命令来自一个shell脚本,文件是由JDK中的工具创建的。我相信
/usr/ssl/openssl.cnf
包含一个名为
policy\u anything
的策略,其中包含上述设置。您可以使用
policy
参数来使用它,如下所示:
opensslca-policy-policy\u anything-days 365-out/root/ca/certs/out.pem-in-certreq.csr
policy\u anything
帮了我的忙。显然,这是一种比摆弄CSR位或OpenSSL配置更方便的方法。如果您想在默认情况下使用
policy\u anything
,您可以将配置更新为
policy=policy\u anything
,然后在需要时使用
-policy-policy\u match
(或者您可以创建自己的默认策略)您是否能够执行任何
awk
体操来完成此任务?您不能更改CSR中的字节,因为它已签名。您确定它应该是一个单独的答案吗?我想是的。它提供了一种更简单的解决问题的方法。“找不到任何政策的“部分”。。。这并不能解决任何问题:(有时它被称为
policy\u loose