質問編集履歴

1 Q②について:クライアント認証についての詳細を追記

tutttwi

tutttwi score 20

2016/07/13 23:52  投稿

サーブレット内でのSSL認証処理について教えて下さい*
Javaサーブレット内にSSL認証処理を実装しなければならないのですが、
そもそも一般的にどのような実装をされているかというところが理解出来ておりません。。
理解不足で大変申し訳ござませんが、ご教示の程宜しくお願い致します。
# SSL認証処理についての今の理解
###★事前準備(インフラ)
【サーバー側準備】
■キーストア構築
0. キーペアの作成
0. CSRの作成
認証局に証明書を発行してもらうためにサーバーの情報を格納したものを作成
0. 認証局にCSRの提出
0. サーバー証明書の取得
0. サーバー証明書のインポート
■トラストストア構築
0. クライント側のルート証明書をインポート
【クライアント側準備】
■キーストア構築
0. キーペアの作成
0. CSRの作成
0. 認証局にCSRの提出
0. サーバー証明書の取得
0. サーバー証明書のインポート
■トラストストア構築
サーバー側のルート証明書をインポート
上記事前準備が整ったらJavaの実装ができると考えておりますが、
Q①:実際は「サーバー認証」のみであれば、サーバー側の証明書の準備が整っていれば
十分なのではと考えておりますが、あっておりますでしょうか?
### ★Java実装
色々なWebページのソースを参照させていただいたのですが、
記載方法が各々異なり、どれが正であるかの判断がつきかねましたので、
すみませんが、
Q②:SSL認証を考慮した実装方法をご教示ください。。(HttpsURLConnectionを使用したもの)
setSSLSocketFactory等を使用??
★追記:HTTPSリクエストを送信するクライアント(リクエストを送信するサーブレットが置かれているサーバー)  
⇔受信サーバー(サーブレットからのリクエストを受けて結果を返すサーバー) 間のクライアント認証部分になります。  
 
 
 
また、SSL認証処理について具体的には以下の2種類の観点があるのかと考えております。
サーバー認証 :サーバーのキーストアにインストールされている証明書の中身について処理
クラアント認証:サーバー側で利用される予定のクライアントからのアクセスであることを認証する為の処理
Q③:クライアント側の実装する際は「サーバー認証」にて証明書の中身の妥当性を判断する場合に、
SSL認証処理を実装する必要があると考えて良いでしょうか?
※単に中身について見ないのであれば下記Javaのように普通につなぎに行って良いものでしょうか?
HttpURLConnectionを使用しても問題ない認識でサーバー認証は裏でやってくれると思っております。
```lang-java
package jp.co.bussiness.servlet.connect;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.URIException;
import org.apache.commons.httpclient.methods.PutMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.apache.commons.httpclient.util.URIUtil;
public class HttpClientFrom extends HttpServlet {
   @Override
   public void doGet(HttpServletRequest req, HttpServletResponse resp)
           throws ServletException, IOException {
       System.out.println(this.getClass().toString() + "▼処理開始▼");
       String url = "https://example.trust.co.jp/connection/ssl"; //★Https指定★
       HttpClient client = new HttpClient();
       PutMethod method = new PutMethod(url);
       method.setRequestHeader("Content-Type", "text/plain; charset=UTF-8");
       String body = "members-id=" + URIUtil.encode("A=9999", null) + "&"
               + "members-name=" + URIUtil.encode("テスト=管理者", null) + "&"
               + "address=" + URIUtil.encode("テス都テスト区テスト町9丁目9-99&マイハウス", null);
       RequestEntity entity = new StringRequestEntity(body, null, "utf-8");
       method.setRequestEntity(entity);
       int statusCode = client.executeMethod(method); //★接続★
       log("Httpステータス : " + statusCode);
       System.out.println(this.getClass().toString() + "▲処理終了▲");
       resp.setContentType("text/html; charset=UTF-8");
       resp.getWriter().write(
               "<html>"
               + "<head></head>"
               + "<body>"
               + "<h1>クラス : "+ this.getClass().toString() + "</h1>"
               + "</br>"
               + "レスポンスコード : " + statusCode +
               "<br/>" +
               "<a href=\"/MyCat/\">トップページに戻る</a>"
               + "</body>"
               + "</html>"
               );
   }
}
```
【SSL認証参考URL】
--
※下記ページの内容を踏まえて前述の考えに及びました。
▼SSL認証処理サンプル
https://codezine.jp/article/detail/105
▼一方向認証(サーバー認証)と双方向認証(クライアント・サーバー認証)
http://otndnld.oracle.co.jp/document/products/wls/docs103/secmanage/ssl.html
> 一方向および双方向 SSL
SSL は、一方向または双方向としてコンフィグレーションできます。
- 一方向 SSL では、サーバはクライアントに対して証明書を提示する必要があるが、クライアントはサーバに対して証明書を提示する必要がない。クライアントはサーバを認証する必要がありますが、サーバはどのクライアントからの接続も受け入れます。一方向 SSL は、インターネット上で顧客が個人データを共有する前にセキュアな接続を実現したい場合によく使用されます。クライアントがログインするときにも、サーバが認証できるように SSL を使用することがよくあります。
- 双方向 SSL (SSL とクライアント認証) の場合、サーバはクライアントに証明書を提示し、クライアントはサーバに証明書を提示する。クライアントが有効で信頼性のある証明書を発行しなければ SSL 接続を確立できないように WebLogic Server をコンフィグレーションできます。
▼サーバー認証は接続に言ったタイミングで裏で処理してくれると思った理由
> SSLのハンドシェイク実行時に、SSLサーバからSSLクライアントにサーバ証明書が送信されます。
そのサーバ証明書の検証はどこで行っているのでしょうか?
> 中で既に標準的な検証は実装されています。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10140922810
▼HttpURLConnectionでもよいと思った理由
> 接続先がhttpsの場合url.openConnection()が実際戻すクラスはHttpsURLConnection ですが、HttpURLConnectionの派生であるため、特に意識することなく使用できます。
HttpsURLConnectionを使った送受信ではデータは暗号化されますが、意識する必要 はありません。
https://ssltest2.verisign.co.jp/はベリサイン社のHTTPS検証サイトです。
GETでもPOSTでも簡単な応答を返してくれます。 サンプルプログラムでは無意味なXMLを送っていますが、 無視してくれます
http://k-hiura.cocolog-nifty.com/blog/2012/04/javahttphttps-1.html#navi_bar
Q④:下記URLにある実装で「SSL証明書の検証無効化とホスト名検証を無効化」する
理由(メリット)は何なのでしょうか?
http://d.hatena.ne.jp/Kazuhira/20141004/1412441208
以上4点になります。
すみませんが、ご教示の程宜しくお願い致します。
  • Java

    24148 questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • SSL

    1004 questions

    SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

  • servlet

    852 questions

    Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る