modul Gem::Security
Gems signieren
Die Gem::Security implementiert kryptographische Signaturen für Gems. Der folgende Abschnitt ist eine Schritt-für-Schritt-Anleitung zur Verwendung von signierten Gems und zur Erzeugung eigener.
Anleitung
Erstellen Ihres Zertifikats
Um Ihre Gems zu signieren, müssen Sie einen privaten Schlüssel und ein selbstsigniertes Zertifikat erstellen. Hier ist, wie das geht:
# build a private key and certificate for yourself: $ gem cert --build you@example.com
Dies kann je nach Geschwindigkeit Ihres Computers einige Sekunden bis ein oder zwei Minuten dauern (Public-Key-Algorithmen sind nicht gerade die schnellsten Kryptographie-Algorithmen der Welt). Wenn es fertig ist, sehen Sie die Dateien „gem-private_key.pem“ und „gem-public_cert.pem“ im aktuellen Verzeichnis.
Zuerst: Verschieben Sie beide Dateien nach ~/.gem, falls Sie in diesem Verzeichnis noch keinen Schlüssel und kein Zertifikat haben. Stellen Sie sicher, dass die Dateiberechtigungen den Schlüssel für andere unlesbar machen (standardmäßig wird die Datei sicher gespeichert).
Halten Sie Ihren privaten Schlüssel geheim; wenn er kompromittiert wird, kann jemand Pakete unter Ihrem Namen signieren (Hinweis: PKI bietet Möglichkeiten, das Risiko gestohlener Schlüssel zu mindern; mehr dazu später).
Gems signieren
In RubyGems 2 und neuer ist keine zusätzliche Arbeit erforderlich, um einen Gem zu signieren. RubyGems findet automatisch Ihren Schlüssel und Ihr Zertifikat in Ihrem Home-Verzeichnis und verwendet sie, um neu verpackte Gems zu signieren.
Wenn Ihr Zertifikat nicht selbstsigniert ist (von einem Dritten signiert), versucht RubyGems, die Zertifikatkette aus den vertrauenswürdigen Zertifikaten zu laden. Verwenden Sie gem cert --add signing_cert.pem, um Ihre Unterzeichner als vertrauenswürdige Zertifikate hinzuzufügen. Siehe unten für weitere Informationen zu Zertifikatsketten.
Wenn Sie Ihren Gem erstellen, wird er automatisch signiert. Wenn Sie in Ihre Gem-Datei schauen, werden Sie sehen, dass ein paar neue Dateien hinzugefügt wurden.
$ tar tf your-gem-1.0.gem metadata.gz metadata.gz.sig # metadata signature data.tar.gz data.tar.gz.sig # data signature checksums.yaml.gz checksums.yaml.gz.sig # checksums signature
Gems manuell signieren
Wenn Sie Ihren Schlüssel an einem separaten sicheren Ort speichern möchten, müssen Sie Ihre Gems manuell für die Signatur einrichten. Tun Sie dies, indem Sie signing_key und cert_chain im Gem-Spezifikationsfile vor dem Verpacken Ihres Gems festlegen.
s.signing_key = '/secure/path/to/gem-private_key.pem' s.cert_chain = %w[/secure/path/to/gem-public_cert.pem]
Wenn Sie Ihren Gem mit diesen Optionen verpacken, lädt RubyGems automatisch Ihren Schlüssel und Ihr Zertifikat von den sicheren Pfaden.
Signierte Gems und Sicherheitsrichtlinien
Jetzt überprüfen wir die Signatur. Installieren Sie den Gem, aber fügen Sie die folgenden Optionen hinzu: -P HighSecurity, wie folgt:
# install the gem with using the security policy "HighSecurity" $ sudo gem install your.gem -P HighSecurity
Die Option -P legt Ihre Sicherheitsrichtlinie fest – darüber sprechen wir gleich. Äh, was ist das?
$ gem install -P HighSecurity your-gem-1.0.gem
ERROR: While executing gem ... (Gem::Security::Exception)
root cert /CN=you/DC=example is not trusted
Der Übeltäter hier ist die Sicherheitsrichtlinie. RubyGems hat mehrere verschiedene Sicherheitsrichtlinien. Machen wir eine kurze Pause und gehen die Sicherheitsrichtlinien durch. Hier ist eine Liste der verfügbaren Sicherheitsrichtlinien und eine kurze Beschreibung jeder einzelnen.
-
NoSecurity- Nun, überhaupt keine Sicherheit. Signierte Pakete werden wie unsignierte Pakete behandelt. -
LowSecurity- So gut wie keine Sicherheit. Wenn ein Paket signiert ist, stellt RubyGems sicher, dass die Signatur mit dem Signaturzertifikat übereinstimmt und dass das Signaturzertifikat nicht abgelaufen ist, aber das war's dann auch schon. Ein bösartiger Benutzer könnte diese Art von Sicherheit leicht umgehen. -
MediumSecurity- Besser alsLowSecurityundNoSecurity, aber immer noch fehlerhaft.Package-Inhalte werden gegen das Signaturzertifikat verifiziert, und das Signaturzertifikat wird auf Gültigkeit geprüft und gegen den Rest der Zertifikatkette geprüft (wenn Sie nicht wissen, was eine Zertifikatkette ist, bleiben Sie dran, wir kommen dazu). Die größte Verbesserung gegenüberLowSecurityist, dassMediumSecuritykeine Pakete installiert, die von nicht vertrauenswürdigen Quellen signiert wurden. Leider istMediumSecurityimmer noch nicht völlig sicher – ein bösartiger Benutzer kann den Gem immer noch entpacken, die Signaturen entfernen und den Gem unsigniert verteilen. -
HighSecurity- Hier ist der Übeltäter, der uns in diese Lage gebracht hat. Die RichtlinieHighSecurityist identisch mit der RichtlinieMediumSecurity, mit der Ausnahme, dass sie keine unsignierten Gems zulässt. Ein bösartiger Benutzer hat hier nicht viele Möglichkeiten; er kann den Paketinhalt nicht ändern, ohne die Signatur ungültig zu machen, und er kann die Signatur oder die Signaturzertifikatkette nicht ändern oder entfernen, sonst weigert sich RubyGems einfach, das Paket zu installieren. Na ja, vielleicht haben sie ja mehr Glück, wenn sie CPAN-Benutzern Probleme bereiten :).
Der Grund, warum RubyGems Ihren glänzenden neuen signierten Gem nicht installieren wollte, war, dass er von einer nicht vertrauenswürdigen Quelle stammte. Nun, Ihr Code ist fehlerfrei (natürlich), also müssen Sie sich selbst als vertrauenswürdige Quelle hinzufügen.
# add trusted certificate gem cert --add ~/.gem/gem-public_cert.pem
Sie haben jetzt Ihr öffentliches Zertifikat als vertrauenswürdige Quelle hinzugefügt. Jetzt können Sie Pakete, die von Ihrem privaten Schlüssel signiert wurden, ohne Probleme installieren. Versuchen wir den obigen Installationsbefehl erneut.
# install the gem with using the HighSecurity policy (and this time # without any shenanigans) $ gem install -P HighSecurity your-gem-1.0.gem Successfully installed your-gem-1.0 1 gem installed
Diesmal wird RubyGems Ihr signiertes Paket akzeptieren und mit der Installation beginnen.
Während Sie darauf warten, dass RubyGems seine Magie wirkt, schauen Sie sich einige der anderen Sicherheitsbefehle an, indem Sie gem help cert ausführen.
Options:
-a, --add CERT Add a trusted certificate.
-l, --list [FILTER] List trusted certificates where the
subject contains FILTER
-r, --remove FILTER Remove trusted certificates where the
subject contains FILTER
-b, --build EMAIL_ADDR Build private key and self-signed
certificate for EMAIL_ADDR
-C, --certificate CERT Signing certificate for --sign
-K, --private-key KEY Key for --sign or --build
-A, --key-algorithm ALGORITHM Select key algorithm for --build from RSA, DSA, or EC. Defaults to RSA.
-s, --sign CERT Signs CERT with the key from -K
and the certificate from -C
-d, --days NUMBER_OF_DAYS Days before the certificate expires
-R, --re-sign Re-signs the certificate from -C with the key from -K
Wir haben bereits die Option --build behandelt, und die Befehle --add, --list und --remove scheinen ziemlich selbsterklärend; sie erlauben Ihnen, die Zertifikate in Ihrer Liste vertrauenswürdiger Zertifikate hinzuzufügen, aufzulisten und zu entfernen. Aber was ist mit der Option --sign?
Zertifikatsketten
Um diese Frage zu beantworten, werfen wir einen Blick auf „Zertifikatsketten“, ein Konzept, das ich zuvor erwähnt habe. Selbstsignierte Zertifikate haben ein paar Probleme: Erstens bieten selbstsignierte Zertifikate keine große Sicherheit. Sicher, das Zertifikat besagt Yukihiro Matsumoto, aber woher weiß ich, dass es tatsächlich von matz selbst generiert und signiert wurde, es sei denn, er hat mir das Zertifikat persönlich gegeben?
Das zweite Problem ist die Skalierbarkeit. Sicher, wenn es 50 Gem-Autoren gibt, dann habe ich 50 vertrauenswürdige Zertifikate, kein Problem. Was ist, wenn es 500 Gem-Autoren gibt? 1000? Ständig neue vertrauenswürdige Zertifikate hinzufügen zu müssen, ist eine Plage und macht das Vertrauenssystem tatsächlich unsicherer, indem es RubyGems-Benutzer dazu ermutigt, neuen Zertifikaten blind zu vertrauen.
Hier kommen Zertifikatsketten ins Spiel. Eine Zertifikatkette etabliert eine beliebig lange Vertrauenskette zwischen einem ausstellenden Zertifikat und einem Kind-Zertifikat. Anstatt also Zertifikaten auf einer pro-Entwickler-Basis zu vertrauen, verwenden wir das PKI-Konzept der Zertifikatsketten, um eine logische Hierarchie des Vertrauens aufzubauen. Hier ist ein hypothetisches Beispiel für eine Vertrauenshierarchie, die (ungefähr) auf Geografie basiert:
--------------------------
| rubygems@rubygems.org |
--------------------------
|
-----------------------------------
| |
---------------------------- -----------------------------
| seattlerb@seattlerb.org | | dcrubyists@richkilmer.com |
---------------------------- -----------------------------
| | | |
--------------- ---------------- ----------- --------------
| drbrain | | zenspider | | pabs@dc | | tomcope@dc |
--------------- ---------------- ----------- --------------
Anstatt jetzt 4 vertrauenswürdige Zertifikate zu haben (eines für drbrain, zenspider, pabs@dc und tomecope@dc), könnte ein Benutzer tatsächlich mit einem Zertifikat auskommen, dem „rubygems@rubygems.org“-Zertifikat.
So funktioniert es:
Ich installiere „rdoc-3.12.gem“, ein Paket, das von „drbrain“ signiert wurde. Ich habe noch nie von „drbrain“ gehört, aber sein Zertifikat hat eine gültige Signatur vom Zertifikat „seattle.rb@seattlerb.org“, welches wiederum eine gültige Signatur vom Zertifikat „rubygems@rubygems.org“ hat. Voilà! An diesem Punkt ist es für mich viel vernünftiger, einem von „drbrain“ signierten Paket zu vertrauen, da ich eine Kette zu „rubygems@rubygems.org“ herstellen kann, dem ich vertraue.
Zertifikate signieren
Die Option --sign ermöglicht all dies. Ein Entwickler erstellt sein Build-Zertifikat mit der Option --build, lässt es dann signieren, indem er es zu seinem nächsten regionalen Ruby-Treffen (in unserem hypothetischen Beispiel) mitbringt, und es wird dort vom Inhaber des regionalen RubyGems-Signaturzertifikats signiert, welches auf der nächsten RubyConf vom Inhaber des Top-Level-RubyGems-Zertifikats signiert wird. An jedem Punkt führt der Aussteller denselben Befehl aus.
# sign a certificate with the specified key and certificate # (note that this modifies client_cert.pem!) $ gem cert -K /mnt/floppy/issuer-priv_key.pem -C issuer-pub_cert.pem --sign client_cert.pem
Dann kann der Inhaber des ausgestellten Zertifikats (in diesem Fall Ihr Kumpel „drbrain“) dieses signierte Zertifikat verwenden, um RubyGems zu signieren. Übrigens, um allen anderen sein neues schickes signiertes Zertifikat bekannt zu machen, würde „drbrain“ sein neu signiertes Zertifikat als ~/.gem/gem-public_cert.pem speichern.
Offensichtlich existiert diese RubyGems-Vertrauensinfrastruktur noch nicht. Auch im „echten Leben“ generieren Aussteller das Kind-Zertifikat tatsächlich aus einer Zertifikatsanforderung, anstatt ein bestehendes Zertifikat zu signieren. Und unserer hypothetischen Infrastruktur fehlt ein Zertifikats-Widerrufs-System. Dies sind Dinge, die in Zukunft behoben werden können...
An diesem Punkt sollten Sie wissen, wie Sie all diese neuen und interessanten Dinge tun können:
-
Einen Gem-Signierschlüssel und ein Zertifikat erstellen
-
Ihre Sicherheitsrichtlinie anpassen
-
Ihre Liste vertrauenswürdiger Zertifikate ändern
-
Ein Zertifikat signieren
Signaturen manuell überprüfen
Falls Sie RubyGems nicht vertrauen, können Sie Gem-Signaturen manuell überprüfen.
-
Den Gem abrufen und entpacken
gem fetch some_signed_gem tar -xf some_signed_gem-1.0.gem
-
Die öffentliche Schlüsseldatei aus dem Gemspec abrufen
gem spec some_signed_gem-1.0.gem cert_chain | \ ruby -rpsych -e 'puts Psych.load($stdin)' > public_key.crt
-
Einen SHA1-Hash der data.tar.gz-Datei generieren
openssl dgst -sha1 < data.tar.gz > my.hash
-
Die Signatur überprüfen
openssl rsautl -verify -inkey public_key.crt -certin \ -in data.tar.gz.sig > verified.hash
-
Ihren Hash mit dem verifizierten Hash vergleichen
diff -s verified.hash my.hash
-
Wiederholen Sie 5 und 6 mit metadata.gz
OpenSSL Referenz
Die von --build und --sign generierten .pem-Dateien sind PEM-Dateien. Hier sind ein paar nützliche OpenSSL-Befehle zur Manipulation dieser Dateien:
# convert a PEM format X509 certificate into DER format: # (note: Windows .cer files are X509 certificates in DER format) $ openssl x509 -in input.pem -outform der -out output.der # print out the certificate in a human-readable format: $ openssl x509 -in input.pem -noout -text
Und dasselbe können Sie auch mit der privaten Schlüsseldatei tun.
# convert a PEM format RSA key into DER format: $ openssl rsa -in input_key.pem -outform der -out output_key.der # print out the key in a human readable format: $ openssl rsa -in input_key.pem -noout -text
Fehler/TODO
-
Es gibt keine Möglichkeit, eine systemweite Vertrauensliste zu definieren.
-
Benutzerdefinierte Sicherheitsrichtlinien (aus einer
YAML-Datei usw.) -
Einfache Methode zur Erzeugung einer angeforderten signierten Zertifikatsdatei
-
Unterstützung für OCSP, SCVP, CRLs oder eine andere Form der Zertifikatsstatusprüfung (Liste ist in Reihenfolge der Präferenz)
-
Unterstützung für verschlüsselte private Schlüssel
-
Eine Art semi-formale Vertrauenshierarchie (siehe langatmige Erklärung oben)
-
Pfad-Erkennung (für Gem-Zertifikatsketten, die keinen selbstsignierten Root haben) – übrigens, da wir dies nicht haben, MUSS DER ROOT DER ZERTIFIKATSKETTE SELBSTSIGNIERT SEIN, wenn
Policy#verify_roottrue ist (und das ist für die RichtlinienMediumSecurityundHighSecurityder Fall). -
Bessere Erklärung der X509-Benennung (d.h. wir müssen keine E-Mail-Adressen verwenden)
-
AIA-Feld berücksichtigen (siehe Hinweis zu OCSP oben)
-
Erweiterungsbeschränkungen berücksichtigen
-
Es wäre vielleicht besser, die Zertifikatkette als PKCS#7- oder PKCS#12-Datei zu speichern, anstatt als Array, das in den Metadaten eingebettet ist.
Originalautor
Paul Duncan <pabs@pablotron.org> pablotron.org/
Constants
- AlmostNoSecurity
-
AlmostNo-Sicherheitsrichtlinie: Nur überprüfen, ob das Signaturzertifikat dasjenige ist, das die Daten tatsächlich signiert hat. Es wird keine Anstrengung unternommen, die Signaturzertifikatkette zu überprüfen.
Diese Richtlinie ist im Grunde nutzlos. Besser als nichts, aber sie kann immer noch leicht gefälscht werden und wird nicht empfohlen.
- DEFAULT_KEY_ALGORITHM
-
Standardalgorithmus, der beim Erstellen eines Schlüsselpaares verwendet wird
- EC_NAME
-
Benannte Kurve, die für Elliptische Kurven verwendet wird
- EXTENSIONS
-
Die Standarderweiterungen sind:
-
Das Zertifikat ist keine Zertifizierungsstelle
-
Der Schlüssel des Zertifikats kann für die Ver- und Entschlüsselung von Schlüsseln und Daten sowie für digitale Signaturen verwendet werden.
-
Das Zertifikat enthält einen Subject Key Identifier
-
- HighSecurity
-
Hohe Sicherheitsrichtlinie: Nur signierte Gems zulassen, das Signaturzertifikat überprüfen, die Signaturzertifikatkette bis zum Root-Zertifikat überprüfen und nur Root-Zertifikaten vertrauen, für die wir explizit Vertrauen gewährt haben.
Diese Sicherheitsrichtlinie ist erheblich schwieriger zu umgehen und bietet eine angemessene Garantie, dass der Inhalt des Gems nicht verändert wurde.
- KEY_CIPHER
-
Cipher, der zum Verschlüsseln des Schlüsselpaares zum Signieren von Gems verwendet wird. Muss in der von
OpenSSL::Cipher.cipherszurückgegebenen Liste enthalten sein. - LowSecurity
-
Niedrige Sicherheitsrichtlinie: Nur überprüfen, ob das Signaturzertifikat tatsächlich der Gem-Signierer ist und dass das Signaturzertifikat gültig ist.
Diese Richtlinie ist besser als nichts, aber sie kann immer noch leicht gefälscht werden und wird nicht empfohlen.
- MediumSecurity
-
Mittlere Sicherheitsrichtlinie: Das Signaturzertifikat überprüfen, die Signaturzertifikatkette bis zum Root-Zertifikat überprüfen und nur Root-Zertifikaten vertrauen, für die wir explizit Vertrauen gewährt haben.
Diese Sicherheitsrichtlinie ist angemessen, aber sie erlaubt unsignierte Pakete, sodass eine böswillige Person einfach die Paket-Signatur löschen und den Gem als unsigniert ausgeben könnte.
- NoSecurity
-
Keine Sicherheitsrichtlinie: Alle Überprüfungen von Paket-Signaturen sind deaktiviert.
- ONE_DAY
-
Ein Tag in Sekunden
- ONE_YEAR
-
Ein Jahr in Sekunden
- Policies
-
Hashder konfigurierten Sicherheitsrichtlinien - RSA_DSA_KEY_LENGTH
-
Länge von Schlüsseln, die von RSA- und DSA-Schlüsseln erstellt werden
- SigningPolicy
-
Policy, die zum Überprüfen eines Zertifikats und Schlüssels beim Signieren eines Gems verwendet wird
Öffentliche Klassenmethoden
Source
# File lib/rubygems/security.rb, line 385 def self.alt_name_or_x509_entry(certificate, x509_entry) alt_name = certificate.extensions.find do |extension| extension.oid == "#{x509_entry}AltName" end return alt_name.value if alt_name certificate.send x509_entry end
Source
# File lib/rubygems/security.rb, line 401 def self.create_cert(subject, key, age = ONE_YEAR, extensions = EXTENSIONS, serial = 1) cert = OpenSSL::X509::Certificate.new cert.public_key = get_public_key(key) cert.version = 2 cert.serial = serial cert.not_before = Time.now cert.not_after = Time.now + age cert.subject = subject ef = OpenSSL::X509::ExtensionFactory.new nil, cert cert.extensions = extensions.map do |ext_name, value| ef.create_extension ext_name, value end cert end
Erstellt ein unsigniertes Zertifikat für subject und key. Die Lebensdauer des Schlüssels reicht von der aktuellen Zeit bis zu age, was standardmäßig ein Jahr beträgt.
Die extensions beschränken die Verwendung des Schlüssels auf die angegebenen Zwecke.
Source
# File lib/rubygems/security.rb, line 440 def self.create_cert_email(email, key, age = ONE_YEAR, extensions = EXTENSIONS) subject = email_to_name email extensions = extensions.merge "subjectAltName" => "email:#{email}" create_cert_self_signed subject, key, age, extensions end
Erstellt ein selbstsigniertes Zertifikat mit einem Aussteller und Subjekt aus email, einem alternativen Subjektnamen von email und den angegebenen extensions für den key.
Source
# File lib/rubygems/security.rb, line 452 def self.create_cert_self_signed(subject, key, age = ONE_YEAR, extensions = EXTENSIONS, serial = 1) certificate = create_cert subject, key, age, extensions sign certificate, key, certificate, age, extensions, serial end
Erstellt ein selbstsigniertes Zertifikat mit einem Aussteller und Subjekt von subject und den angegebenen extensions für den key.
Source
# File lib/rubygems/security.rb, line 462 def self.create_digest(algorithm = DIGEST_NAME) OpenSSL::Digest.new(algorithm) end
Erstellt eine neue Digest-Instanz unter Verwendung des angegebenen algorithm. Standardmäßig ist dies SHA256.
Source
# File lib/rubygems/security.rb, line 470 def self.create_key(algorithm) if defined?(OpenSSL::PKey) case algorithm.downcase when "dsa" OpenSSL::PKey::DSA.new(RSA_DSA_KEY_LENGTH) when "rsa" OpenSSL::PKey::RSA.new(RSA_DSA_KEY_LENGTH) when "ec" OpenSSL::PKey::EC.generate(EC_NAME) else raise Gem::Security::Exception, "#{algorithm} algorithm not found. RSA, DSA, and EC algorithms are supported." end end end
Erstellt ein neues Schlüsselpaar des angegebenen algorithm. RSA, DSA und EC werden unterstützt.
Source
# File lib/rubygems/security.rb, line 489 def self.email_to_name(email_address) email_address = email_address.gsub(/[^\w@.-]+/i, "_") cn, dcs = email_address.split "@" dcs = dcs.split "." OpenSSL::X509::Name.new([ ["CN", cn], *dcs.map {|dc| ["DC", dc] }, ]) end
Verwandelt email_address in einen OpenSSL::X509::Name.
Source
# File lib/rubygems/security.rb, line 425 def self.get_public_key(key) # Ruby 3.0 (Ruby/OpenSSL 2.2) or later return OpenSSL::PKey.read(key.public_to_der) if key.respond_to?(:public_to_der) return key.public_key unless key.is_a?(OpenSSL::PKey::EC) ec_key = OpenSSL::PKey::EC.new(key.group.curve_name) ec_key.public_key = key.public_key ec_key end
Ruft den richtigen öffentlichen Schlüssel aus einer PKey-Instanz ab.
Source
# File lib/rubygems/security.rb, line 508 def self.re_sign(expired_certificate, private_key, age = ONE_YEAR, extensions = EXTENSIONS) raise Gem::Security::Exception, "incorrect signing key for re-signing " + expired_certificate.subject.to_s unless expired_certificate.check_private_key(private_key) unless expired_certificate.subject.to_s == expired_certificate.issuer.to_s subject = alt_name_or_x509_entry expired_certificate, :subject issuer = alt_name_or_x509_entry expired_certificate, :issuer raise Gem::Security::Exception, "#{subject} is not self-signed, contact #{issuer} " \ "to obtain a valid certificate" end serial = expired_certificate.serial + 1 create_cert_self_signed(expired_certificate.subject, private_key, age, extensions, serial) end
Signiert das expired_certificate mit dem private_key, wenn die Schlüssel übereinstimmen und das abgelaufene Zertifikat selbstsigniert war.
Source
# File lib/rubygems/security.rb, line 533 def self.reset @trust_dir = nil end
Setzt das Vertrauensverzeichnis für die Überprüfung von Gems zurück.
Source
# File lib/rubygems/security.rb, line 544 def self.sign(certificate, signing_key, signing_cert, age = ONE_YEAR, extensions = EXTENSIONS, serial = 1) signee_subject = certificate.subject signee_key = certificate.public_key alt_name = certificate.extensions.find do |extension| extension.oid == "subjectAltName" end extensions = extensions.merge "subjectAltName" => alt_name.value if alt_name issuer_alt_name = signing_cert.extensions.find do |extension| extension.oid == "subjectAltName" end extensions = extensions.merge "issuerAltName" => issuer_alt_name.value if issuer_alt_name signed = create_cert signee_subject, signee_key, age, extensions, serial signed.issuer = signing_cert.subject signed.sign signing_key, Gem::Security::DIGEST_NAME end
Signiert den öffentlichen Schlüssel von certificate mit dem signing_key und signing_cert unter Verwendung von Gem::Security::DIGEST_NAME. Verwendet den Standard-Gültigkeitsbereich und die Standard-Erweiterungen des Zertifikats.
Gibt das neu signierte Zertifikat zurück.
Source
# File lib/rubygems/security.rb, line 572 def self.trust_dir return @trust_dir if @trust_dir dir = File.join Gem.user_home, ".gem", "trust" @trust_dir ||= Gem::Security::TrustDir.new dir end
Gibt ein Gem::Security::TrustDir zurück, das das Verzeichnis umschließt, in dem vertrauenswürdige Zertifikate gespeichert sind.
Source
# File lib/rubygems/security.rb, line 583 def self.trusted_certificates(&block) trust_dir.each_certificate(&block) end
Listet die vertrauenswürdigen Zertifikate über Gem::Security::TrustDir auf.
Source
# File lib/rubygems/security.rb, line 592 def self.write(pemmable, path, permissions = 0o600, passphrase = nil, cipher = KEY_CIPHER) path = File.expand_path path File.open path, "wb", permissions do |io| if passphrase && cipher io.write pemmable.to_pem cipher, passphrase else io.write pemmable.to_pem end end path end
Schreibt pemmable, das auf to_pem reagieren muss, nach path mit den angegebenen permissions. Wenn cipher und passphrase übergeben werden, werden diese an to_pem weitergegeben.