ActionMailer_X509:Ruby On Railsでメールに直接署名して暗号化する

最新のプロジェクトの1 つでは 、X.509証明書を使用してアプリケーションからRuby on Rails 3に送信されたレターに署名および暗号化する必要がありました。クイック検索でactionmailer_x509プラグインが見つかりましたが、問題が始まりました。



2008年以降に更新されていないことが判明しました。Rails3では動作しない可能性が高く(特に、著者のコメント「Rails 2.0.1でテスト済み」と混同されます)、署名のみできますが、暗号化はできません。 代替 ソリューションを 検索しても何も得られず、プラグインをよりよく知る必要がありました。







知り合いはすぐに複雑になりました。プラグインに付属する一連のテストは実行中に落ちました。 判明したように、すぐに気づくのは容易ではありませんでしたが、実際には、テストスイートに作成者が含めた証明書の有効期限が切れていました。 再作成された証明書。 次に、テストヘルパーからRails 2からライブラリを削除し、Rails 3から対応するライブラリを追加して、いくつかの変更を行いました。



Ruby on Rails 3で現在使用されている新しいメール処理gemであるMailは、 Tmailとは大きく異なることがすぐに明らかになりました 。 MailとTmailの内部構造に切り込み、Tmailに影響するすべての部分を書き直さなければなりませんでした。 できた もちろん、私は手紙の未配達の見出しをいじって転送しましたが、これは解決しました。



新しい問題:コードのコメントに、著者 「注:メール全体を再解析できません。TMailは署名を壊す\ r \ nを追加します...」と書いています。 実際、署名の検証は機能せず、Mail \ r \ nオブジェクトの結果の本文には60文字ごとに、元の文字には64文字ごとに存在します。この問題は長い間戦わなければなりませんでした。 すべてをgsubで配置し、Mail gemコードを調べ、Mailにバグレポートを残し、メーリングリストに書き込みましたが、すべて無駄でした。 最終的に、 stackoverflowに関する質問は私を救った。 Mailはcontent-idを追加し、メッセージヘッダーを変更するため、署名が正しくなくなり、これは元のactionmailer_x509の作成者が書いた\ r \ nとは関係ありません。



content_idの修正と強制インストールの後、すべてがスムーズに進みました。コードをクリーンアップし、すべてを別のgemでラップし、rakeジョブを修正し、メッセージの暗号化を担当するコードを追加しました。



githubのフォークactionmailer_x509で 、またはGemfileの行gem 'actionmailer_x509'を使用して、私の作業の結果を楽しむことができます。



次の簡単なコードを使用して、送信メールの署名や暗号化を有効にできます。



class FooMailer < ActionMailer::Base def sending_method(email, from , subject = "Empty subject for signed") #    x509_sign true x509_sign_cert "certs/yourwebsite.crt" x509_sign_key "certs/yourwebsite.key" #     x509_sign_passphrase "my passphrase for the certificate" #    x509_crypt true x509_crypt_cert "certs/crypt.crt" #    ,     DES x509_crypt_cipher "AES-128-CBC" mail(:subject => subject, :to => email, :from => from) end end
      
      







さらに、プラグインを使用すると、アプリケーション全体にこれらの主要な設定をすべて設定でき、設定と速度をテストするためのいくつかのrakeタスクが提供されます。 詳細については、 READMEを参照してください



結論の代わりに


1か月以上、actionmailer_x509をRuby on Rails 3の機能に適合させました。私はsmime openssl、gem Mail、gem Tmail、およびActionMailerを研究しました。 コードをgemでラップする方法と、gemの構造がどのように見えるべきかを学びました。 Railtieを使用して、最終的なRailsアプリケーションで見えるように、rakeタスクを正しくロードする方法。 私はあきらめる準備ができていて、私の問題を解決するための回避策を探していましたが、幸いなことに、私はなんとか宝石を絞ることができました。



費やした時間を後悔せず、新しく作成された宝石を満足感で見てください。 今では、Ruby on Railsのメールキッチン全体について非常に気分がよくなり、OpenSSLに関連する事項についてより多くの知識を得ています。 突然、既存のソリューションを完成/作成するか、何らかの方法で問題を回避することを選択する必要がある場合-コミュニティで何か新しいことを試してみてください。



All Articles