iOS13に上がったことで、「サーバーの識別情報を検証できません」のメッセージで悩んでいる方が多いようで。
サーバ証明書作成に使った openssl.cnfの必要な抜粋を載せてみる。
HOME = .
RANDFILE = $ENV::HOME/.rnd
oid_section = new_oids
[ new_oids ]
tsa_policy1 = 1.2.3.4.1
tsa_policy2 = 1.2.3.4.5.6
tsa_policy3 = 1.2.3.4.5.7
[ ca ]
default_ca = CA_default # The default ca section
[ CA_default ]
dir = /etc/ssl/foobaa.CA # Where everything is kept
certs = $dir/certs # Where the issued certs are kept
crl_dir = $dir/crl # Where the issued crl are kept
database = $dir/index.txt # database index file.
# several ctificates with same subject.
new_certs_dir = $dir/newcerts # default place for new certs.
certificate = $dir/cacert.pem # The CA certificate
serial = $dir/serial # The current serial number
crlnumber = $dir/crlnumber # the current crl number
# must be commented out to leave a V1 CRL
crl = $dir/crl.pem # The current CRL
private_key = $dir/private/cakey.pem# The private key
RANDFILE = $dir/private/.rand # private random number file
x509_extensions = usr_cert # The extentions to add to the cert
name_opt = ca_default # Subject Name options
cert_opt = ca_default # Certificate field options
default_days = 820 # 2019/09/25 for iOS13 securiy policy
default_crl_days= 30 # how long before next CRL
default_md = sha256
preserve = no # keep passed DN ordering
policy = policy_match
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
default_bits = 2048
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
x509_extensions = v3_ca # The extentions to add to the self signed cert
string_mask = utf8only
req_extensions = v3_req
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = JP
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Tokyo
localityName = Locality Name (eg, city)
localityName_default = Shinagawa
0.organizationName = Organization Name (eg, company)
0.organizationName_default = SamaToComapany
organizationalUnitName = Organizational Unit Name (eg, section)
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_max = 64
emailAddress = Email Address
emailAddress_max = 64
[ req_attributes ]
challengePassword = A challenge password
challengePassword_min = 4
challengePassword_max = 20
unstructuredName = An optional company name
[ usr_cert ]
basicConstraints=CA:FALSE
nsComment = "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer:always
subjectAltName= @alt_names
extendedKeyUsage = critical,timeStamping,serverAuth,clientAuth,codeSigning,emailProtection
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName =@alt_names
extendedKeyUsage = serverAuth,clientAuth,codeSigning,emailProtection
[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = CA:true
[ crl_ext ]
authorityKeyIdentifier=keyid:always
[ proxy_cert_ext ]
basicConstraints=CA:FALSE
nsComment = "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo
[ tsa ]
default_tsa = tsa_config1 # the default TSA section
[ tsa_config1 ]
dir = /etc/ssl/foobaa.CA # TSA root directory
serial = $dir/tsaserial # The current serial number (mandatory)
crypto_device = builtin # OpenSSL engine to use for signing
signer_cert = $dir/tsacert.pem # The TSA signing certificate
# (optional)
certs = $dir/cacert.pem # Certificate chain to include in reply
# (optional)
signer_key = $dir/private/tsakey.pem # The TSA private key (optional)
default_policy = tsa_policy1 # Policy if request did not specify it
# (optional)
other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional)
digests = sha256 # Acceptable message digests (mandatory)
accuracy = secs:1, millisecs:500, microsecs:100 # (optional)
clock_precision_digits = 0 # number of digits after dot. (optional)
ordering = yes # Is ordering defined for timestamps?
# (optional, default: no)
tsa_name = yes # Must the TSA name be included in the reply?
# (optional, default: no)
ess_cert_id_chain = no # Must the ESS cert id chain be included?
# (optional, default: no)
[ ca_cert ]
basicConstraints=CA:TRUE
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer:always
nsCertType = sslCA, emailCA
keyUsage = cRLSign, keyCertSign
[alt_names]
DNS.1 = foobaa.com
DNS.2 = *.foobaa.com
iOS13に上がったことで、「サーバーの識別情報を検証できません」のメッセージで悩んでいる方が多いようで。
サーバ証明書作成に使った openssl.cnfの必要な抜粋を載せてみる。
HOME = .
RANDFILE = $ENV::HOME/.rnd
oid_section = new_oids
[ new_oids ]
tsa_policy1 = 1.2.3.4.1
tsa_policy2 = 1.2.3.4.5.6
tsa_policy3 = 1.2.3.4.5.7
[ ca ]
default_ca = CA_default # The default ca section
[ CA_default ]
dir = /etc/ssl/foobaa.CA # Where everything is kept
certs = $dir/certs # Where the issued certs are kept
crl_dir = $dir/crl # Where the issued crl are kept
database = $dir/index.txt # database index file.
# several ctificates with same subject.
new_certs_dir = $dir/newcerts # default place for new certs.
certificate = $dir/cacert.pem # The CA certificate
serial = $dir/serial # The current serial number
crlnumber = $dir/crlnumber # the current crl number
# must be commented out to leave a V1 CRL
crl = $dir/crl.pem # The current CRL
private_key = $dir/private/cakey.pem# The private key
RANDFILE = $dir/private/.rand # private random number file
x509_extensions = usr_cert # The extentions to add to the cert
name_opt = ca_default # Subject Name options
cert_opt = ca_default # Certificate field options
default_days = 820 # 2019/09/25 for iOS13 securiy policy
default_crl_days= 30 # how long before next CRL
default_md = sha256
preserve = no # keep passed DN ordering
policy = policy_match
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
default_bits = 2048
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
x509_extensions = v3_ca # The extentions to add to the self signed cert
string_mask = utf8only
req_extensions = v3_req
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = JP
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Tokyo
localityName = Locality Name (eg, city)
localityName_default = Shinagawa
0.organizationName = Organization Name (eg, company)
0.organizationName_default = SamaToComapany
organizationalUnitName = Organizational Unit Name (eg, section)
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_max = 64
emailAddress = Email Address
emailAddress_max = 64
[ req_attributes ]
challengePassword = A challenge password
challengePassword_min = 4
challengePassword_max = 20
unstructuredName = An optional company name
[ usr_cert ]
basicConstraints=CA:FALSE
nsComment = "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer:always
subjectAltName= @alt_names
extendedKeyUsage = critical,timeStamping,serverAuth,clientAuth,codeSigning,emailProtection
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName =@alt_names
extendedKeyUsage = serverAuth,clientAuth,codeSigning,emailProtection
[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = CA:true
[ crl_ext ]
authorityKeyIdentifier=keyid:always
[ proxy_cert_ext ]
basicConstraints=CA:FALSE
nsComment = "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo
[ tsa ]
default_tsa = tsa_config1 # the default TSA section
[ tsa_config1 ]
dir = /etc/ssl/foobaa.CA # TSA root directory
serial = $dir/tsaserial # The current serial number (mandatory)
crypto_device = builtin # OpenSSL engine to use for signing
signer_cert = $dir/tsacert.pem # The TSA signing certificate
# (optional)
certs = $dir/cacert.pem # Certificate chain to include in reply
# (optional)
signer_key = $dir/private/tsakey.pem # The TSA private key (optional)
default_policy = tsa_policy1 # Policy if request did not specify it
# (optional)
other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional)
digests = sha256 # Acceptable message digests (mandatory)
accuracy = secs:1, millisecs:500, microsecs:100 # (optional)
clock_precision_digits = 0 # number of digits after dot. (optional)
ordering = yes # Is ordering defined for timestamps?
# (optional, default: no)
tsa_name = yes # Must the TSA name be included in the reply?
# (optional, default: no)
ess_cert_id_chain = no # Must the ESS cert id chain be included?
# (optional, default: no)
[ ca_cert ]
basicConstraints=CA:TRUE
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer:always
nsCertType = sslCA, emailCA
keyUsage = cRLSign, keyCertSign
[alt_names]
DNS.1 = foobaa.com
DNS.2 = *.foobaa.com
iOS13にアップデートしたところ、iPhoneのMailソフトで 自前の imap(dovecot)サーバにつながらなくなってしまった。
メッセージは「サーバーの識別情報を検証できません」。
全くノーケアだったけど原因は、
「iOS 13 および macOS 10.15 における信頼済み証明書の要件」の中にある、
- TLS サーバ証明書は、証明書の SAN (Subject Alternative Name) 拡張領域にサーバの DNS 名を記述する必要がある。証明書の CommonName の DNS 名は今後は信頼されなくなります。
- TLS サーバ証明書には ExtendedKeyUsage (EKU) 拡張領域を必ず含め、ここに id-kp-serverAuth OID を指定する必要がある。
- TLS サーバ証明書の有効期間は 825 日以下である (証明書の NotBefore フィールドと NotAfter フィールドで明記)。
あたりか?CAの証明書とsignについてはすでにsha256で行っていたので問題ないはず。cnをもう見ない、というのはうかつにも知らなかった。
SANへの対応について参照したのは、
このページ。行った変更は、openssl.cnf において
- default_days を 820(日)に
- [req] セクションに"req_extensions = v3_req" を追加。
- [ usr_cert ] セクションに "authorityKeyIdentifier=keyid,issuer:always","subjectAltName= @alt_names","extendedKeyUsage = critical,timeStamping,serverAuth,clientAuth,codeSigning,codeSigning,emailProtection" を追加。
- [ v3_req ]セクションに、"subjectAltName =@alt_names","extendedKeyUsage = serverAuth,clientAuth,codeSigning,emailProtection" を追加。
- [alt_names]セクションを新たに新設、ここに 'DNS.1= foo.baa.com","DNS.2 = *.foo.baa.com" などと記述。
これで、新たにサーバ証明書を作成し、dovecotの証明書として利用する。
とりあえずこれでエラーは出なくなり、以前通り接続できるようになった。
EKUのOIDとかも勝手に引っ張ってきてくれる。
httpd、sendmail のサーバー証明書、クライアント証明書も同じようにするかな・・・
iOS13にアップデートしたところ、iPhoneのMailソフトで 自前の imap(dovecot)サーバにつながらなくなってしまった。
メッセージは「サーバーの識別情報を検証できません」。
全くノーケアだったけど原因は、
「iOS 13 および macOS 10.15 における信頼済み証明書の要件」の中にある、
- TLS サーバ証明書は、証明書の SAN (Subject Alternative Name) 拡張領域にサーバの DNS 名を記述する必要がある。証明書の CommonName の DNS 名は今後は信頼されなくなります。
- TLS サーバ証明書には ExtendedKeyUsage (EKU) 拡張領域を必ず含め、ここに id-kp-serverAuth OID を指定する必要がある。
- TLS サーバ証明書の有効期間は 825 日以下である (証明書の NotBefore フィールドと NotAfter フィールドで明記)。
あたりか?CAの証明書とsignについてはすでにsha256で行っていたので問題ないはず。cnをもう見ない、というのはうかつにも知らなかった。
SANへの対応について参照したのは、
このページ。行った変更は、openssl.cnf において
- default_days を 820(日)に
- [req] セクションに"req_extensions = v3_req" を追加。
- [ usr_cert ] セクションに "authorityKeyIdentifier=keyid,issuer:always","subjectAltName= @alt_names","extendedKeyUsage = critical,timeStamping,serverAuth,clientAuth,codeSigning,codeSigning,emailProtection" を追加。
- [ v3_req ]セクションに、"subjectAltName =@alt_names","extendedKeyUsage = serverAuth,clientAuth,codeSigning,emailProtection" を追加。
- [alt_names]セクションを新たに新設、ここに 'DNS.1= foo.baa.com","DNS.2 = *.foo.baa.com" などと記述。
これで、新たにサーバ証明書を作成し、dovecotの証明書として利用する。
とりあえずこれでエラーは出なくなり、以前通り接続できるようになった。
EKUのOIDとかも勝手に引っ張ってきてくれる。
httpd、sendmail のサーバー証明書、クライアント証明書も同じようにするかな・・・