【问题标题】:Signing a certificate with my CA用我的 CA 签署证书
【发布时间】:2011-08-07 22:09:13
【问题描述】:

运行中:

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-----

有什么想法吗?提前致谢。

【问题讨论】:

  • 能否贴出相关的PEM文件(当然除了key文件)?
  • 谢谢。希望我添加了正确的文件,如果那里有密钥文件,它们只是测试文件。
  • 是的,命令来自shell脚本,文件是由JDK中的工具创建的。

标签: certificate openssl


【解决方案1】:

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

# For the CA policy

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

【讨论】:

  • 我相信 /usr/ssl/openssl.cnf 包含一个名为 policy_anything 的策略,其中包含上述设置。您可以通过使用policy 参数来使用它,如下所示:openssl ca -policy policy_anything -days 365 -out /root/ca/certs/out.pem -in certreq.csr
  • policy_anything 为我解决了问题。绝对比摆弄 CSR 位或 OpenSSL 配置更方便。
  • 如果您想默认使用policy_anything,您可以将配置更新为policy = policy_anything,然后根据需要使用-policy policy_match(或者您可以创建自己的策略作为默认)
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    之前的发帖人已经回答了这个问题,但是为了更容易,这里是一个如何指定编码的例子。使用 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
    

    【讨论】:

      【解决方案4】:

      如图所示:

      openssl asn1parse -in req.csr  
      

      请求 DN 字符串被编码为 PRINTABLESTRING。

      openssl asn1parse -in cacert.pem 
      

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

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

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

      然后尝试重新签名。

      【讨论】:

      • 您是否能够通过任何awk 体操来完成这项工作?
      • 您无法更改 CSR 中的字节,因为它已签名。
      【解决方案5】:

      我刚刚遇到了这个问题。根本原因是客户端和 CA 的 openssl.cnf 中的 string_mask 值不匹配。简单的解决方法是修改客户端的值以匹配 CA 的预期,然后重新生成 CSR。硬性修复是编辑 CA 的值并启动一个新的 CA。

      【讨论】:

        【解决方案6】:

        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 
        

        【讨论】:

        • 你确定它应该是一个单独的答案吗?
        • 我想是的。它提供了一种更简单的解决问题的方法。
        • "无法为 policy_anything 找到“部分”" ...这不能解决任何问题:(
        • 有时它被称为policy_loose
        猜你喜欢
        • 1970-01-01
        • 2018-03-20
        • 1970-01-01
        • 2016-11-24
        • 2016-07-08
        • 2016-04-02
        • 1970-01-01
        • 2013-07-13
        • 2020-08-12
        相关资源
        最近更新 更多