私はBottleを使用してRESTfulWebサービスを開発していますが、おそらく間もなくWerkzeugに移行します。秘密鍵と公開鍵のペアに基づいて機能する認証スキームを実装したいと思います。サーバーは公開部分のみを保存し、ユーザーは秘密部分を保持します。アクセス時に、サーバーは、サーバーが検証して公開鍵部分に関連付けることができる秘密鍵を使用してアクションを実行するようにアクセサーに要求します。成功すると、たとえば、しばらくの間使用できるトークンが生成されます。WerkzeugまたはBottleにこのようなものを実装するためのパスは何ですか?私が作業できるプロジェクト/例はありますか?
1 に答える
ここでの最善の選択肢は、暗号化を扱う責任を別のものに移すことだと思います。WebサーバーとCA(認証局)はそれでうまくいきます。
基本的に、彼らは完全に
- 接続が安全であることを確認してください
- クライアントが有効な(たとえば、あなたの)CAによって署名された証明書を使用していることを確認します
- 証明書が取り消されていないことを確認してください
- 必要な唯一の情報をアプリケーションに提供します:リモートパーティの識別子
このようなメカニズムを使用してサードパーティの支払いサービス(申し訳ありませんが、プライベートコード)を認証します。Redmineへのプラグインもあり、クライアント認証の同じメカニズムを提供します。これも使用します(確かに、Rubyですが、これもそのようなサービスが野生で見つかることができるという有効な証拠。)
物事を機能させるために必要なのは
- CAを構成します。
- Webサーバーを構成して、権限による証明書とこれらの証明書のみを受け入れ、クライアントIDをアプリにさらに渡すようにします。
- アプリケーションがリクエストからクライアント識別子を抽出できることを確認してください。
以下は、easyrsa、nginx、uWsgi、werkzeugの小さな例です。
CAを構成する
easyrsaツールキットはOpenVPNインストールの一部です。OpenSSLの「raw」コマンドまたはPyOpenSSLを使用することは可能ですが、easyrsaは便利で、少なくともコンセプトの段階では適しています。
cp -a /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/nginx/easyrsa
cd /etc/nginx/easyrsa && source vars && ./clean-all
CAを作成する
./build-ca
サーバー証明書を作成する
./build-key --server server
クライアント証明書を作成します。
./build-key-pkcs12 client1
上記のサンプルでは、クライアント秘密鍵とそれに対応する公開部分(証明書)の両方を作成しますが、代わりにクライアント証明書要求に署名し、秘密部分にアクセスできないことを前提としています。
一部のサービスでは、秘密鍵と証明書のペアが生成され、ダウンロードページに「これが秘密鍵をダウンロードする唯一の機会です。保存されないため、後でダウンロードすることはできません」というメッセージを書き込みます。
さらに、このコマンドは、暗号化されたキーと証明書を使用してPKCS12ファイルを作成します。これは、ブラウザーへのインポートに便利です。
nginxを構成する
まず、CAが自己署名するため、「サーバー証明書+CA証明書」のペアを作成する必要があります。
cat keys/server.crt keys/ca.crt > keys/server_and_ca.crt
次に、次の構成を適用できます。
server {
listen 443;
location / {
# Here we define the name and the contents of the WSGI variable to pass to service
uwsgi_param SSL_CLIENT_ID $ssl_client_s_dn;
include uwsgi_params;
uwsgi_pass 127.0.0.1:5000;
}
# SSL support
ssl on;
ssl_protocols SSLv3 TLSv1;
ssl_certificate easyrsa/keys/ca_and_server.crt;
ssl_certificate_key easyrsa/keys/server.key;
# We don't accept anyone without correct client certificate
ssl_verify_client on;
# The CA we use to verify client certificates
ssl_client_certificate easyrsa/keys/ca.crt;
}
構成オプションの詳細については、こちらとこちらをご覧ください。
/ etc / nginx / easyrsaディレクトリへの正しい権限があり、rootとnginxのみが秘密鍵にアクセスできることを確認してください。
Werkzeugアプリケーションを作成する
Pythonの部分は簡単です。WSGI環境から変数SSL_CLIENT_IDを読み取るだけです。
ファイル内のサンプルアプリケーションの内容sample.py
from werkzeug.wrappers import Response
def application(environ, start_response):
text = 'Hello, your certificate id is %s\n' % environ.get('SSL_CLIENT_ID', '(unknown)')
response = Response(text, mimetype='text/plain')
return response(environ, start_response)
uwsgiサーバーでサービスを起動します。uwsgi -w sample:application --socket 127.0.0.1:5000
インストールをテストします
curlでテストするのは簡単です
$ curl --cert keys/client1.crt --key keys/client1.key --cacert keys/ca.crt https://localhost/
Hello, your certificate id is /C=US/ST=CA/L=SanFrancisco/O=Fort-Funston/OU=changeme/CN=client1/name=changeme/emailAddress=mail@host.domain