Аутентификация Общей платы доступа (CAC) Используя Java

Следующая функция воспроизводит поведение, приведенное в ваших примерах:

function f(x) {
    var m, u;
    m = Math.floor(Math.log10(x));
    u = Math.pow(10, Math.max(1, m - 1));
    return u * Math.floor(x / u);
}

Если вы были бы рады округлить до 2 значащих цифр, вы можете использовать

function f(x) {
    return Number.parseFloat(x.toPrecision(2));
}
27
задан Tombart 8 February 2015 в 15:25
поделиться

3 ответа

Вы создаете веб-приложение или пытаетесь записать программное обеспечение, которое работает в клиенте (вид подобных Ваш собственный веб-браузер)?

при создании веб-приложения это - в значительной степени просто стандартная клиентская аутентификация сертификации. То, что сертификат прибыл из аппаратного ключа, не изменяется очень для сервера; если Вы хотите принять только сертификаты CAC, можно указать набор приемлемых политик сертификата, когда сервер проверяет клиентский сертификат. (Проверка политики является стандартным компонентом проверки PKIX.), Если это приложение для правительственного клиента, необходимо будет работать в тесном сотрудничестве с их службой безопасности, чтобы гарантировать, что решение отвечает их требованиям, которые могут быть строгими. Если это - Ваш сценарий, сообщите мне, и я обновлю свой ответ с некоторыми проблемами, с которыми мы встретились.

, Если Вы пишете клиенту и должны получить доступ к физическому читателю, Вы можете использовать Sun поставщик PKCS № 11 , начиная с Java 1.5. Я экспериментировал с этим поставщиком, и можно читать больше об этом в другой ответ.

<час>

На сервере, необходимо проверить, что сертификат не отменяется. Однако некоторые из этих CRLs огромны — у нас была ценность на более чем 100 Мбит файлов CRL, и встроенное средство проверки аннулирования Sun не масштабируется хорошо к этому размеру.

необходимо будет также удостовериться, что у Вас есть правильные корневые сертификаты CA в "доверительной" базе ключей Tomcat (правительственный корень, который сертификаты CA немного более тверды найти, потому что они хотят удостовериться, что пользователи проверяют их правильно). Мы также нашли, что Firefox не отправляет всю цепочку сертификата, если пользователи не импортируют промежуточные сертификаты в свой браузер вручную.

15
ответ дан Community 28 November 2019 в 05:48
поделиться

Изучите возможность использования аутентификации сертификата с помощью приложения типа SSO, такого как OpenSSO или JOSSO . Агент должен быть проще встраивать, и они уже реализовали большую часть деталей. Если вам нужно сделать это самостоятельно, у них также есть много документации, связанной с необходимыми шагами, такими как: настройка цифровых сертификатов

0
ответ дан 28 November 2019 в 05:48
поделиться

Вам нужно создать файл с именем 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());
         }
      }
   }
}

На данный момент у вас есть хранилище ключей, которое можно использовать для создания ssl-сокета для связи с веб-сервером https.

9
ответ дан 28 November 2019 в 05:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: