web-dev-qa-db-ja.com

Javaを使用したCommon Access Card(CAC)認証

私は基本的に、Javaを使用して政府のCACカードとインターフェースする方法を学ぶためのどこかを探しています。

最終的に、私の目標は、CACカード認証を使用して(PIN番号によって)、Tomcat/J2EEサーバーを使用してホストされているWebサイトへのアクセスを承認する方法を見つけることです。

しかし、私はどこかから始める必要があります。だから、私は小さなJavaプログラムを書いて、キーボードのカードリーダーに挿入されているCACカードからCACカード情報を読み取るだけにすることから始めると思います(上記のCACリーダー付きDellキーボード)テンキー)。

グーグルを検索して、cacardJava project( https://cacard.dev。 Java.net/ )はOpenSSOプロジェクトに置き換えられました。しかし、それを使用する方法のサンプルコードを見つけることができないようですカードへの接続、カードからの読み取りなど.

Javaを使用してCACカードを操作する方法を学ぶことができるように、サンプルコードの場所を知っている人はいますか?

ありがとう

編集:

もっと調べてみたところ、clientAuth="true"のコネクタ要素でserver.xmlファイル?

http://Tomcat.Apache.org/Tomcat-6.0-doc/ssl-howto.html

clientAuth:このソケットを使用するためにすべてのSSLクライアントにクライアント証明書の提示を要求する場合は、この値をtrueに設定します。

27
Paul

Webアプリケーションを作成していますか、それともクライアントで実行するソフトウェア(独自のWebブラウザーのようなもの)を作成しようとしていますか?

Webアプリケーションを作成している場合、それはほとんど標準クライアント認証認証です。証明書がハードウェアトークンからのものであるという事実は、サーバーにとってあまり変わりません。 onlyCAC証明書を受け入れる場合は、サーバーがクライアント証明書を検証するときに、受け入れ可能な証明書ポリシーのセットを指定できます。 (ポリシーの検証はPKIX検証の標準的な部分です。)このアプリケーションが政府機関の顧客向けである場合は、セキュリティチームと緊密に連携して、ソリューションが要件を満たしていることを確認する必要があります。これがあなたのシナリオである場合は、私に知らせてください。私が遭遇したいくつかの問題で回答を更新します。

クライアントを作成していて、物理的なリーダーにアクセスする必要がある場合は、Java 1.5なので、 Sun PKCS#11プロバイダー を使用できる場合があります。私はveはこのプロバイダーを実験しました。詳細については another answer。 を参照してください。


サーバーで、証明書が取り消されていないことを確認する必要があります。ただし、これらのCRLの一部は巨大です。100MBを超えるCRLファイルがあり、組み込みのSun失効チェッカーは適切に拡張できません。このサイズ。

また、Tomcatの「信頼できる」鍵ストアに適切なルートCA証明書があることを確認する必要があります(政府のルートCA証明書は、ユーザーが適切に確認していることを確認する必要があるため、見つけるのが少し難しくなります)。また、ユーザーが中間証明書をブラウザーに手動でインポートしない限り、Firefoxは証明書チェーン全体を送信しないこともわかりました。

15
erickson

card.configというファイルを作成し、その中に次の行を含める必要があります。

name = myConfig
library = /path/to/library/that/implements/cac/card/reader 

そして、これを試してください:

import Java.io.*;
import Java.util.*;

import Java.security.cert.CertificateException;
import Java.security.KeyStoreException;
import Java.security.cert.X509Certificate;

import Java.security.KeyStore;
import Java.security.Provider;
import Java.security.SecureRandom;
import Java.security.Security;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;

public class Test  
{
   public static void  main(String arg[]) throws Exception
   {
       try
       {   
         //Create our certificates from our CAC Card
         String configName = "card.config";
         Provider p = new Sun.security.pkcs11.SunPKCS11(configName);
         Security.addProvider(p);

         //Get the pin from user entered data
         Console c = System.console();
         char[] pin = c.readPassword("Enter your PIN: ");
         KeyStore cac = null;

         cac = KeyStore.getInstance("PKCS11");
         cac.load(null, pin);

         showInfoAboutCAC(cac);

      }
      catch(Exception ex)
      {
         //System.out.println("*" + ex.getMessage());
         ex.printStackTrace();
         System.exit(0);
      }
   }

   public static void showInfoAboutCAC(KeyStore ks) throws KeyStoreException, CertificateException
   {
      Enumeration<String> aliases = ks.aliases();

      while (aliases.hasMoreElements()) 
      {
         String alias = aliases.nextElement();
         X509Certificate[] cchain = (X509Certificate[]) ks.getCertificateChain(alias);

         System.out.println("Certificate Chain for : " + alias);
         for (int i = 0; i < cchain.length; i ++)
         {
            System.out.println(i + " SubjectDN: " + cchain[i].getSubjectDN());
            System.out.println(i + " IssuerDN:  " + cchain[i].getIssuerDN());
         }
      }
   }
}

この時点で、https Webサーバーと通信するsslソケットを作成するために使用できるキーストアがあります。

9
Jay

OpenSSO または [〜#〜] josso [〜#〜] などのSSOタイプのアプリケーションを使用して証明書認証を使用することを検討してください。エージェントは簡単に埋め込むことができ、詳細のほとんどがすでに実装されています。自分で行う必要がある場合は、次のような必要な手順に関連する多くのドキュメントも用意されています。 デジタル証明書のセットアップ

0
Joshua