web-dev-qa-db-ja.com

Firefox 54は自己署名証明書の信頼を停止しました

Firefox 54の最近のアップグレードで、自己署名localhost SSL証明書が信頼されなくなりました。

Firefox AutoConfigure script を使用してこの証明書をインストールしましたが、この手法は数年間正常に機能しています。 Firefoxは、独自の証明書ストアcert8.dbを使用します。これには、Firefoxの設定、詳細設定、証明書、証明書の表示、認証局を使用して検証された証明書が含まれます。

これは、MacOSとWindowsの両方で再現可能です。参照用のサンプル証明書を添付しました。これは、インストールするものと同じです。

Firefox 54の変更点 changelog を確認しましたが、証明書を信頼する方法に固有の情報は見つかりません。

編集:この変更をもたらした可能性が高いFirefoxのバグへのリンク: firefox#1294580

-----BEGIN CERTIFICATE-----
MIID/DCCAuSgAwIBAgIEDZj+fTANBgkqhkiG9w0BAQsFADCBmjELMAkGA1UEBhMC
VVMxCzAJBgNVBAgTAk5ZMRIwEAYDVQQHEwlDYW5hc3RvdGExGzAZBgNVBAoTElFa
IEluZHVzdHJpZXMsIExMQzEbMBkGA1UECxMSUVogSW5kdXN0cmllcywgTExDMRww
GgYJKoZIhvcNAQkBFg1zdXBwb3J0QHF6LmlvMRIwEAYDVQQDEwlsb2NhbGhvc3Qw
HhcNMTcwMjEyMDMzMjEwWhcNMzcwMjEyMDMzMjEwWjCBmjELMAkGA1UEBhMCVVMx
CzAJBgNVBAgTAk5ZMRIwEAYDVQQHEwlDYW5hc3RvdGExGzAZBgNVBAoTElFaIElu
ZHVzdHJpZXMsIExMQzEbMBkGA1UECxMSUVogSW5kdXN0cmllcywgTExDMRwwGgYJ
KoZIhvcNAQkBFg1zdXBwb3J0QHF6LmlvMRIwEAYDVQQDEwlsb2NhbGhvc3QwggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCemwdWhvytOwhsRyEo/9ck3nKP
oBvMdkaiXKbMWlYZfYyb/EsJzw/LiEqGGhflWjneQLcgq0nuTtRaA9cm/vgPtVRX
OHewJeYBI2C4avJyjdFfQYHJKxuLi3nwmZ5JwcDm04H6SADwdyQuYB4AFr32uY5D
3id0gyDV+EX9sSOPThtdBpEbaBcFmAdAGdQUCzSJyi4Yu6UkIs7OPBHp9lOvm8VQ
r6ZVnqdFEXmxgpgMS0sQwDwZnBB3hFcVmE/sYy+2gV/h+yvRUjgqwC/SoLh9f4D0
eG19E3OEmsSyFM9K2Wl4ltOE/Aq1KFm7dPw34nDKxYcVDpm6JczWycbCi4zjAgMB
AAGjSDBGMCUGA1UdEQQeMByCCWxvY2FsaG9zdIIPbG9jYWxob3N0LnF6LmlvMB0G
A1UdDgQWBBT3Qs6/qQSmunLIGKQxz3GBO+RgIzANBgkqhkiG9w0BAQsFAAOCAQEA
lVI3sWr6wTtVtc7gsV9Kk99xNOUm5W2kp/Ot5CHvUIw68Ar1WIiouWT9BbjkvFc+
QpbtqKhluTdHI1/JP44r7A8qMApyYQLhw3AS/WTzRoOBOECJk3hYgGBIxAaoqvKY
HKCOULTqkoX8pgNhYobebn/BpeoSvXW+oxT21y7ElE01eMtrLsqXKaN5FODxVzJq
7jatxCaRZCy2Ki3R0cB5ZMIVvWSDeT1TLgh5UKWdldNsTdTNhbQSdm8ayU0uj4fH
tKqwh9lKvrBJiawghmADjZjeNEQzIJfjznF/soqVZnRNZO/phDH327lDE2UcD1IN
k4BqNRJmz5lrQeYz8GcfYA==
-----END CERTIFICATE-----
17
tresf

Firefox 54で義務付けられているCAチェーンの要件を模倣するには、次のものが必要です。

  1. ルートCAとしてマークされたキーペア。SSL証明書を生成できます。
  2. ルートCAからチェーン証明書を取得するSSL用にマークされた2番目のキーペア

プライベートキーストアを作成する手順を含むJava keytoolでこれがどのように行われるかを説明するには:

# Create a Root-CA private keystore capable of issuing SSL certificates
keytool -genkeypair -noprompt -alias my-ca -keyalg RSA -keysize 2048 -dname CN=localhost -validity 3650 -keystore .\my-ca.jks -storepass pass77 -keypass pass77 -ext ku:critical=cRLSign,keyCertSign -ext bc:critical=ca:true,pathlen:1

# Export the Root-CA certificate, to be used in the final SSL chain
keytool -exportcert -alias my-ca -keystore .\my-ca.jks -storepass pass77 -keypass pass77 -file .\my-ca.crt -rfc -ext ku:critical=cRLSign,keyCertSign -ext bc:critical=ca:true,pathlen:1

# Create a container SSL private keystore (external localhost.foo.bar dns entry optional:IE11 domain intranet policy)
keytool -genkeypair -noprompt -alias my-ssl -keyalg RSA -keysize 2048 -dname CN=localhost -validity 3650 -keystore .\my-ssl.jks -storepass pass77 -keypass pass77 -ext ku:critical=digitalSignature,keyEncipherment -ext eku=serverAuth,clientAuth -ext san=dns:localhost,dns:localhost.foo.bar -ext bc:critical=ca:false

# Create a certificate signing request (CSR) from our SSL private keystore
keytool -certreq -keyalg RSA -alias my-ssl -file .\my-ssl.csr -keystore .\my-ssl.jks -keypass pass77 -storepass pass77

# Issue an SSL certificate from the Root-CA private keystore in response to the request (external localhost.foo.bar dns entry optional)
keytool -keypass pass77 -storepass pass77 -validity 3650 -keystore .\my-ca.jks -gencert -alias my-ca -infile .\my-ssl.csr -ext ku:critical=digitalSignature,keyEncipherment -ext eku=serverAuth,clientAuth -ext san=dns:localhost,dns:localhost.foo.bar -ext bc:critical=ca:false -rfc -outfile .\my-ssl.crt

# Import Root-CA certificate into SSL private keystore
keytool  -noprompt -import -trustcacerts -alias my-ca -file my-ca.crt -keystore my-ssl.jks -keypass pass77 -storepass pass77

# Import an SSL (chained) certificate into keystore
keytool -import -trustcacerts -alias my-ssl -file my-ssl.crt -keystore my-ssl.jks -keypass pass77 -storepass pass77 -noprompt

これが完了すると、ルートCA証明書のみがFirefoxによって信頼される必要があり、GUIまたはAutoConfigスクリプトを使用してインポートできます。

新しいSSLプライベートキーストアを使用してSSLサーバーを再起動する必要があります。これには、SSL経由で動作する信頼チェーンが含まれます。

my-ssl.jksには信頼チェーン全体が含まれますmy-ca.jksmy-ca.crtmy-ssl.crtおよびmy-ssl.csrすべてを安全に削除できます(my-ca.crtが適切にインポートされました)

10
tresf

@tresfの回答に触発され、主にブログ投稿に基づいています ローカルHTTPS開発用に独自のSSL認証局を作成する方法 Brad Touesnardにより、opensslを使用して一連のコマンドを作成しました。

# Generate the root key
openssl genrsa -des3 -out myCA.key 2048

# Generate a root-certificate based on the root-key
openssl req -x509 -new -nodes -key myCA.key -sha256 -days 1825 -out myCA.pem

# Generate a new private key
openssl genrsa -out example.com.key 2048

# Generate a Certificate Signing Request (CSR) based on that private key
openssl req -new -key example.com.key -out example.com.csr

# Create a configuration-file
echo \
"authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = example.com
"> example.com.conf

# Create the certificate for the webserver to serve
openssl x509 -req -in example.com.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial \
-out example.com.crt -days 1825 -sha256 -extfile example.com.conf

これらのファイルの使用方法

1.ブラウザ/キーチェーンによってCAを信頼させる

追加 myCa.pemブラウザ/キーチェーンに追加して、新しいルート証明書によって署名された証明書を信頼する

2.証明書でリクエストに署名する

追加 example.com.crtおよびexample.com.keyドメインへのリクエストに署名するためのウェブサーバーの設定

11
Zombaya

@tresfと@Zombayaが述べたように、Firefoxには2つの証明書が必要です。

  • 機関証明書
  • 開発証明書

機関証明書は、開発証明書に署名するために使用されます。開発証明書はHTTPポートにバインドされます。 Webサーバーは、そのポートでリクエストをリッスンします。

Windows開発環境

他の回答は、JavaおよびUnix環境で何をすべきかを説明します。Windows開発環境で以下を行います。これにより、Firefox、Chrome、およびInternet Explorerによって信頼される証明書が作成されます。

DNSをC:\ Windows\System32\drivers\etc\hostsファイルのエントリで上書きします。

127.0.0.1  dev.brainstorm.com

権限証明書と開発証明書を作成し、PowerShellを使用してローカルマシンの証明書ストアに保存します。 「Brainstorm」を会社名とDNSエントリに置き換えます。 PowerShellを管理者として実行します。

# Create authority certificate.
# TextExtension adds the Server Authentication enhanced key usage and the CA basic contraint.
$authorityCert = New-SelfSignedCertificate `
    -Subject "CN=Brainstorm CA,OU=IT,O=Brainstorm Certificate Authority,C=US" `
    -KeyAlgorithm RSA `
    -KeyLength 4096 `
    -KeyUsage CertSign, CRLSign, DigitalSignature, KeyEncipherment, DataEncipherment `
    -KeyExportPolicy Exportable `
    -NotBefore (Get-Date) `
    -NotAfter (Get-Date).AddYears(10) `
    -HashAlgorithm SHA256 `
    -CertStoreLocation "Cert:\LocalMachine\My" `
    -FriendlyName "Brainstorm CA" `
    -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.1", "2.5.29.19={critical}{text}ca=1")


# Create development certificate.
# Sign it with authority certificate.
# TextExtension adds the Server Authentication enhanced key usage.
$devCert = New-SelfSignedCertificate `
    -Subject "CN=Brainstorm,OU=Application Development,O=Brainstorm,C=US" `
    -DnsName dev.brainstorm.com `
    -KeyAlgorithm RSA `
    -KeyLength 4096 `
    -KeyUsage DigitalSignature, KeyEncipherment, DataEncipherment `
    -KeyExportPolicy Exportable `
    -NotBefore (Get-Date) `
    -NotAfter (Get-Date).AddYears(10) `
    -HashAlgorithm SHA256 `
    -CertStoreLocation "Cert:\LocalMachine\My" `
    -FriendlyName "Brainstorm" `
    -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.1") `
    -Signer $authorityCert

# Export authority certificate to file.
$directory = "C:\Users\Erik\Documents\Temp\Certificates\"
if(!(test-path $directory))
{
New-Item -ItemType Directory -Force -Path $directory
}
$authorityCertPath = 'Cert:\LocalMachine\My\' + ($authorityCert.ThumbPrint)
$authorityCertFilename = $directory + "Authority.cer"
Export-Certificate -Cert $authorityCertPath -FilePath $authorityCertFilename

# Import authority certificate from file to Trusted Root store.
Import-Certificate -FilePath $authorityCertFilename -CertStoreLocation "Cert:\LocalMachine\Root"

# Delete authority certificate file.
Remove-Item -Path $authorityCertFilename

特定のURLとポートでWebサイトとサービスをホストする開発者権限を付与します(IIS Express経由)。Webサイトに標準SSLポートを使用し、サービスに別のポートを使用します。なぜ?IIS Expressは、ホスト名で区別された同じポートで2つのアプリケーションを同時にホストすることはできません。異なるポートを使用する必要があります。

netsh http add urlacl url=https://dev.brainstorm.com:443/ user="Erik"
netsh http add urlacl url=https://dev.brainstorm.com:44300/ user="Erik"

URLでWebサイトをホストする開発者の許可を削除する必要がある場合:

netsh http delete urlacl url=https://dev.brainstorm.com:443/
netsh http delete urlacl url=https://dev.brainstorm.com:44300/

ローカルコンピューターストアの証明書を一覧表示します。

Get-ChildItem -path "Cert:\LocalMachine\My"

(認証局の証明書ではなく)開発証明書のthumb印をコピーします。

HTTPポートにバインドされている証明書を一覧表示します。 (IIS Expressは、独自のSSL証明書でポート44300〜44399を構成します。)

netsh http show sslcert

アプリケーションIDをコピーします(すべてのIIS Expressポート44300-44399)で同じです。既にバインドされているWebサイトとサービスポートを置き換えますIIS Expressを開発に使用します証明書(certhashは上からのis印です)最初にnetshを実行し、次にhttpコマンドを入力し、次にadd sslcert ...コマンドを入力する必要がある場合があります。

netsh http add sslcert hostnameport=dev.brainstorm.com:443 certhash=FE035397A4C44AB591A1D9D4DC0B44074D0F95BA appid={214124cd-d05b-4309-9af9-9caa44b2b74a} certstore=my
netsh http add sslcert hostnameport=dev.brainstorm.com:44300 certhash=FE035397A4C44AB591A1D9D4DC0B44074D0F95BA appid={214124cd-d05b-4309-9af9-9caa44b2b74a} certstore=my

HTTPポートから証明書のバインドを解除する必要がある場合:

netsh http delete sslcert hostnameport=dev.brainstorm.com:443
netsh http delete sslcert hostnameport=dev.brainstorm.com:44300

Visual Studioで、サービスのlaunchSettings.jsonファイル(Propertiesフォルダー内)を構成します。

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "https://dev.brainstorm.com:44300/",
      "sslPort": 44300
    }
  },
  "profiles": {
    "Default": {
      "commandName": "IISExpress",
      "use64Bit": true
    }
  }
}

Visual Studioで、WebサイトのlaunchSettings.jsonファイル(Propertiesフォルダー内)を構成します。

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "https://dev.brainstorm.com/",
      "sslPort": 443
    }
  },
  "profiles": {
    "Default": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "use64Bit": true
    }
  }
}

構成IIS Express(非表示の.vs/configフォルダー内):

<sites>
  <site name="Website" id="1" serverAutoStart="true">
    <application path="/">
      <virtualDirectory path="/" physicalPath="%IIS_SITES_HOME%\WebSite" />
    </application>
    <bindings>
      <binding protocol="https" bindingInformation="*:443:dev.brainstorm.com" />
    </bindings>
  </site>
  <site name="Service" id="2">
    <application path="/">
      <virtualDirectory path="/" physicalPath="%IIS_SITES_HOME%\IIS Service" />
    </application>
    <bindings>
      <binding protocol="https" bindingInformation="*:44300:dev.brainstorm.com" />
    </bindings>
  </site>
  <siteDefaults>
    <logFile logFormat="W3C" directory="%IIS_USER_HOME%\Logs" />
    <traceFailedRequestsLogging directory="%IIS_USER_HOME%\TraceLogFiles" enabled="true" maxLogFileSizeKB="1024" />
  </siteDefaults>
  <applicationDefaults applicationPool="Clr4IntegratedAppPool" />
  <virtualDirectoryDefaults allowSubDirConfig="true" />
</sites>

Firefoxでabout:configに移動し、security.enterprise_roots.enabledパラメーターをtrueに設定します。

4
Erik Madsen

おそらくやりたいことは、信頼しようとしているものと同じサブジェクト、発行者、公開鍵を持つ別の自己署名証明書を生成することです。ただし、エンドエンティティ拡張の代わりに、「basicConstraints:cA」を持つCA証明書であり、「keyUsage:cRLSign、keyCertSign」を持つ証明書を発行できるように指定する必要があります。また、nameConstraints拡張機能を追加して、特定のドメインセットにのみ適用されるように制限することもお勧めします。その証明書をFirefoxの信頼データベースに追加すると、すべてが以前と同様に機能するはずです。

0
David Keeler