带有 URI 片段的 SAN 证书

Ric*_*mer 8 ssl certificate openssl

我需要生成带有 SAN URI 的 TLS 证书,其中 URI 有一个片段(有一个哈希“#”)。但是当我尝试使用 openssl 生成证书时,该片段被删除。

# generate key and CSR for client certificate
openssl req -nodes -new -keyout me.key -out me.csr -subj "/O=Acme/CN=me"

# sign cert
openssl x509 -req -in me.csr -CA My-CA.crt -CAkey My-CA.key -set_serial 01 -out me.crt -extfile <(echo 'subjectAltName=URI:https://my.example/profile#me')

# verify result
openssl x509 -text -noout -in me.crt
#         X509v3 extensions:
#             X509v3 Subject Alternative Name:
#                 URI:https://my.example/profile
Run Code Online (Sandbox Code Playgroud)

我尝试了几种不同的方法来转义该值,但似乎没有任何效果符合预期。我认为转义可能适用于 Common Name 等字段,但不适用于 SAN 部分。

我对 openssl 替代品持开放态度。但如果我能看到一个概念验证证书,我可以用它来验证它是否有效,这将会很有帮助。

注意:这本质上是 WebID-TLS 的要求 ( https://www.w3.org/2005/Incubator/webid/spec/tls/#dfn-webid_certificate )。虽然可以使用不带片段的 URL 作为 WebID,但不建议这样做,并且需要额外的工作。绝对应该支持。

Ste*_*ich 7

OpenSSL 配置中的哈希符号被视为注释的开头,无论配置是在真实文件中给出还是动态生成的。如果您想将其包含在 SAN 中,则需要转义或引用散列,以防止将其视为注释的开头。引用它看起来像这样:

... -extfile <(echo 'subjectAltName="URI:https://my.example/profile#me"')
Run Code Online (Sandbox Code Playgroud)

或逃脱:

... -extfile <(echo 'subjectAltName=URI:https://my.example/profile\#me')
Run Code Online (Sandbox Code Playgroud)


gar*_*Red 4

您可以使用配置文件来定义 SAN:

subjectAltName = @alt_names

[alt_names]
URI.1 = http://example.test/some\#thing
Run Code Online (Sandbox Code Playgroud)