証明書を提供できることは、残念ながら何も証明していません。証明書は完全に公開されており、誰でも任意のWebサイトのSSL証明書を保持できます。証明書には公開鍵が含まれています。対応する秘密鍵の所有権が証明されていることが必要です。
これは可能ですが、スクリプトやOpenSSLターミナルコマンドを実行して秘密鍵で何かを署名する方法を知っている必要があります。ユーザーが自分の秘密鍵をアップロードすることはもちろん、大きなノー・ノーであるということは、ユーザーとして行動できることを意味します。秘密鍵を検証した後、その秘密鍵を破棄するには膨大な信頼が必要です。
技術的な観点からは、ランダムな文字列など、何らかのチャレンジを作成し、この文字列を自分の秘密鍵で暗号化することで検証できます。この文字列を証明書の公開鍵で復号化し、元の文字列を元に戻すと、対応する秘密鍵が所有されていることがわかります。
これを示す自己完結型のRubyスクリプトです。これは、あなたの側で実行されている部分と、その部分で実行されている部分を示すコメントが付いています。
require "openssl"
## This happens on the client side. They generate a private key and a certificate.
## This particular certificate is not signed by a CA - it is assumed that a CA
## signature check is already done elsewhere on the user cert.
user_keypair = OpenSSL::PKey::RSA.new(2048)
user_cert = OpenSSL::X509::Certificate.new
user_cert.not_before = Time.now
user_cert.subject = OpenSSL::X509::Name.new([
["C", "NO"],
["ST", "Oslo"],
["L", "Oslo"],
["CN", "August Lilleaas"]
])
user_cert.issuer = user_cert.subject
user_cert.not_after = Time.now + 1000000000 # 40 or so years
user_cert.public_key = user_keypair.public_key
user_cert.sign(user_keypair, OpenSSL::Digest::SHA256.new)
File.open("/tmp/user-cert.crt", "w+") do |f|
f.write user_cert.to_pem
end
## This happens on your side - generate a random phrase, and agree on a digest algorithm
random_phrase = "A small brown fox"
digest = OpenSSL::Digest::SHA256.new
## The client signs (encrypts a cheksum) the random phrase
signature = user_keypair.sign(digest, random_phrase)
## On your side, verify the signature using the user's certificate.
your_user_cert = OpenSSL::X509::Certificate.new(File.new("/tmp/user-cert.crt"))
puts your_user_cert.public_key.verify(digest, signature, random_phrase + "altered")
# => falase
puts your_user_cert.public_key.verify(digest, signature, random_phrase)
# => true
## On your side - attempting to verify with another public key/keypair fails
malicious_keypair = OpenSSL::PKey::RSA.new(2048)
puts malicious_keypair.public_key.verify(digest, signature, random_phrase)
このスクリプトは、アカウントにCAの検証ステップを取らないことに注意してください - あなたはまた、明らかにユーザーの証明書はあなたが言及したVerisignなどのCAによって検証されていることを確認したい、誰もが証明書を発行することができますので、 foo.comの秘密鍵を保持します。これは、真正性保証を提供する証明書のCA署名です。
どのような種類の証明書をお探しですか?なぜ誰かにあなたのSSL証明書を渡すのですか? – PeeHaa