2016-05-03 14 views
1

私のサイトに電子調達システムの会社を登録する必要があります。これまでは、私は物理的に会って資格を得ることができる地元の企業でしたが、今では世界中のどこにでもある企業になることができます。SSL証明書を使用して、自分のサイトでユーザーの身元を確認してください

解決策は、第三者の証明書を提出するオンライン登録プロセスです。だから、Verisignは彼らが「X社」だと言っているので、X社として登録し、資格証明を発行します。

これはどのように私のサイトに実装できますか?登録フォームに証明書ファイルをアップロードするフィールドを指定するだけですか?バックオフィスでこれらの証明書を手動でチェックしますか?手動でこれをどのようにチェックするのですか?このプロセスを自動化する方法はありますか?

アカウントを取得したら、ログインするために発行したクレデンシャルをリクエストするだけで済みますか?または今後のすべてのログインで同じ証明書ファイルをリクエストできますか?これらの証明書の特定の形式で、私は要求することができますか、または異なる証明書のベンダーが提供するいくつかの一般的な形式を許可する必要がありますか?

ありがとうございます。

+0

どのような種類の証明書をお探しですか?なぜ誰かにあなたのSSL証明書を渡すのですか? – PeeHaa

答えて

1

証明書を提供できることは、残念ながら何も証明していません。証明書は完全に公開されており、誰でも任意の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署名です。

+0

あなたの答えをありがとう。挑戦のステップをより実現可能にする方法は、チャレンジ文字列と秘密のキーが与えられたときに上記のことを行う簡単なダウンロード可能なユーティリティを実際に提供することでしょうか? したがって、クライアントは2ステップで登録されます。 1.情報フィールドに記入して、チャレンジを与え、プログラムをダウンロードし、自分の秘密鍵を自分のシステムで選択します。 2.公開鍵と暗号化されたチャレンジをアップロードしますか? 対象は通常ITスタッフがいる企業なので、自分の公開鍵と秘密鍵を取得する方法を理解していれば実行可能だと思います。 – Totoro53

+1

ええ、プライベートキーでチャレンジに署名することは、間違いなくGUI化することができます。 Rubyコードは、標準のOpenSSLライブラリへのインタフェースに過ぎないため、ほとんどすべての言語/プラットフォームで機能が利用できます。唯一の問題は、自分の秘密鍵をあなたのサーバや不愉快なものにアップロードしないようにあなたのプログラムを信頼しなければならないことです。私の答えのような単純なルビスクリプトか、いくつかのOpenSSL CLIコマンドの例。 –

+1

私はあなたの最後にチャレンジを生成し、それを生成するクライアント側のユーティリティを持たないことをお勧めします。そうすれば、チャレンジが十分に長く独特であることをコントロールできます。 –

関連する問題