it-swarm.com.de

Firefox 54 Vertrauen in selbst signierte Zertifikate gestoppt

Mit dem kürzlich durchgeführten Upgrade von Firefox 54 wurde meinem selbstsignierten localhost-SSL-Zertifikat nicht mehr vertraut.

Ich habe ein Firefox AutoConfigure-Skript verwendet, um dieses Zertifikat zu installieren, und die Technik hat seit mehreren Jahren erfolgreich funktioniert. Firefox verwendet seinen eigenen Zertifikatsspeicher, cert8.db, der das Zertifikat enthält, das mithilfe der Firefox-Voreinstellungen, Erweitert, Zertifikate, Zertifikate anzeigen, Berechtigungen überprüft wurde.

Dies ist sowohl unter MacOS als auch unter Windows reproduzierbar. Ich habe ein Musterzertifikat als Referenz beigefügt. Dies ist identisch mit dem, den wir installieren würden.

Was hat sich in Firefox 54 geändert? Ich habe das changelog überprüft und kann nichts Bestimmtes darüber finden, wie es Zertifikaten vertraut.

Edit: Link zu Firefox-Fehler, der wahrscheinlich zu dieser Änderung führte: 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-----
15
tresf

Um die von Firefox 54 vorgeschriebenen CA-Kettenanforderungen nachzuahmen, ist Folgendes erforderlich:

  1. Schlüsselpaar, das als Root-CA gekennzeichnet ist und ein SSL-Zertifikat generieren kann.
  2. Zweites Schlüsselpaar für SSL, das ein verkettetes Zertifikat von der Root-CA bezieht

Um zu zeigen, wie dies mit Java keytool durchgeführt wird, einschließlich der Schritte zum Erstellen privater Keystores:

# 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

Danach muss nur das Root-CA-Zertifikat von Firefox als vertrauenswürdig eingestuft werden und kann über die GUI oder das AutoConfig-Skript importiert werden.

Der SSL-Server muss mit dem neuen privaten privaten SSL-Schlüsselspeicher neu gestartet werden, der die Vertrauenskette für die Arbeit per SSL enthält.

Da my-ssl.jks die gesamte Vertrauenskette my-ca.jks enthält, können my-ca.crt, my-ssl.crt und my-ssl.csr sicher gelöscht werden (vorausgesetzt, my-ca.crt wurde ordnungsgemäß importiert).

8
tresf

Inspiriert durch die Antwort von @tresf und basiert weitgehend auf dem Blogpost So erstellen Sie eine eigene SSL-Zertifizierungsstelle für lokale HTTPS-Entwicklung von Brad Touesnard, habe ich mit openssl eine Reihe von Befehlen erstellt.

# 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

Verwendung dieser Dateien

1. Lassen Sie Ihrer Zertifizierungsstelle von Ihrem Browser/Schlüsselbund vertrauen

Fügen Sie myCa.pem zu Ihrem Browser/Schlüsselbund hinzu, um den von Ihrem neuen Stammzertifikat signierten Zertifikaten zu vertrauen

2. Unterschreiben Sie die Anforderungen mit Ihrem Zertifikat

Fügen Sie example.com.crt und example.com.key zur Konfiguration Ihres Webservers hinzu, um Anforderungen an Ihre Domain zu signieren

9
Zombaya

Wie @tresf und @Zombaya angegeben haben, benötigt Firefox zwei Zertifikate:

  • Eine behördliche Bescheinigung
  • Ein Entwicklungszertifikat

Das Behördenzertifikat wird zum Signieren des Entwicklungszertifikats verwendet. Das Entwicklungszertifikat ist an einen HTTP-Port gebunden. Der Webserver wartet auf diesen Port auf Anforderungen.

Windows-Entwicklungsumgebung

Weitere Antworten erklären, was in Java- und Unix-Umgebungen zu tun ist. Ich mache das in meiner Windows-Entwicklungsumgebung. Dadurch werden Zertifikate erstellt, denen Firefox, Chrome und Internet Explorer vertrauen:

Überschreiben Sie DNS mit einem Eintrag in der Datei C:\Windows\System32\drivers\etc\hosts.

127.0.0.1  dev.brainstorm.com

Erstellen Sie die Berechtigungs- und Entwicklungszertifikate und speichern Sie sie mithilfe von PowerShell im Zertifikatspeicher des lokalen Computers. Ersetzen Sie "Brainstorm" durch Ihren Firmennamen und Ihren DNS-Eintrag. Führen Sie PowerShell als Administrator aus.

# 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

Erteilen Sie dem Entwickler die Erlaubnis, eine Website und einen Dienst unter bestimmten URLs und Ports zu hosten (über IIS Express). Verwenden Sie einen Standard-SSL-Port für die Website und einen anderen Port für den Service. Warum? IIS Express kann nicht gleichzeitig zwei Anwendungen auf demselben Port hosten, die sich nach Hostnamen unterscheiden. Sie müssen verschiedene Ports verwenden.

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

Wenn Sie die Entwicklerberechtigung für die Host-Website unter der URL entfernen müssen:

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

Listen Sie die Zertifikate im lokalen Computerspeicher auf.

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

Kopieren Sie den Fingerabdruck des Entwicklungszertifikats (nicht das Behördenzertifikat).

Listen Sie die an HTTP-Ports gebundenen Zertifikate auf. (IIS Express konfiguriert die Ports 44300 - 44399 mit einem eigenen SSL-Zertifikat.)

netsh http show sslcert

Kopieren Sie die Anwendungs-ID (es gilt für alle IIS Express-Ports 44300 - 44399). Ersetzen Sie die bereits gebundenen Website- und Service-Ports durch IIS Express durch unser Entwicklungszertifikat (das certhash ist der Fingerabdruck von oben). Sie müssen möglicherweise zuerst netsh ausführen, dann den http-Befehl und dann den Befehl add sslcert ... eingeben.

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

Wenn Sie Zertifikate von HTTP-Ports trennen müssen:

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

Konfigurieren Sie in Visual Studio die Datei launchSettings.json des Diensts (im Ordner Eigenschaften):

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

Konfigurieren Sie in Visual Studio die Datei launchSettings.json der Website (im Ordner Eigenschaften):

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

Configure IIS Express (im ausgeblendeten Ordner .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>

Navigieren Sie in Firefox zu about: config und setzen Sie den Parameter security.enterprise_roots.enabled auf true.

4
Erik Madsen

Sie möchten wahrscheinlich ein anderes selbstsigniertes Zertifikat mit demselben Betreff, Aussteller und öffentlichen Schlüssel wie das Zertifikat erstellen, dem Sie vertrauen möchten. Anstelle von Endentitätserweiterungen sollten Sie jedoch angeben, dass es sich um ein CA-Zertifikat mit "basicConstraints: cA" handelt und dass es Zertifikate mit "keyUsage: cRLSign, keyCertSign" ausstellen kann. Es kann auch eine gute Idee sein, eine Erweiterung nameConstraints hinzuzufügen, um sie auf eine bestimmte Gruppe von Domänen zu beschränken. Wenn Sie dieses Zertifikat zur Vertrauensdatenbank von Firefox hinzufügen, sollte alles wie zuvor funktionieren.

0
David Keeler