0

Написание кода для создания цифровой сертификатЦифровой сертификат добавления пароля к секретному ключу: Не удалось расшифровать файл: Не в PKCS формате # 12,

И при установке в браузере получаю ошибку

Не удалось декодировать файл. Либо это не в формате PKCS # 12, либо поврежден, либо введенный пароль неверен.

Но я не знаю, как добавить этот пароль для удовлетворения PKCS #12 format. Как это сделать?

public KeyPair generateKeyPair() { 
     KeyPair pair = null; 
     try { 
      String password = "1234"; 
      KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); 
      SecureRandom random = Utils.createFixedRandom(); 
      keyGen.initialize(1024, random); 
      pair = keyGen.generateKeyPair(); 
      PrivateKey privkey1 = pair.getPrivate(); 
      PublicKey pubKey1 = pair.getPublic(); 

      byte[] privateKeyBytes = pair.getPrivate().getEncoded(); 
      byte[] encryptedPrivateKeyBytes = passwordEncrypt(
        password.toCharArray(), privateKeyBytes); 

        //Problem might be here 

      Signature dsa = Signature.getInstance("SHA1withRSA"); 
      dsa.initSign(privkey1); 
      Cipher cipher = Cipher 
        .getInstance("RSA"); 
      cipher.init(Cipher.ENCRYPT_MODE, pubKey1, random); 
      byte[] input = new byte[] { (byte) 0xbe, (byte) 0xef }; 
      System.out.println("input : " + Utils.toHex(input)); 
      byte[] cipherText = cipher.doFinal(input); 
      System.out.println("cipher: " + Utils.toHex(cipherText)); 
      cipher.init(Cipher.DECRYPT_MODE, privkey1); 
      byte[] plainText = cipher.doFinal(cipherText); 
      System.out.println("plain : " + Utils.toHex(plainText)); 
     } catch (Exception e) { 
      System.err.println("Caught exception " + e.toString()); 
     } 

     return pair; 

    } 

Сертификат создан успешно и прикреплен здесь.

You can see full code here.

Спасибо за любые подсказки.

+0

Вы устанавливаете это как личный (клиентский) сертификат в своем браузере или в качестве доверенного сертификата сервера в своем браузере? Если это сертификат, которому вы доверяете, вам нужен только файл сертификата, а не PKCS12. , в Firefox, когда вы переходите на вкладку «Диспетчер сертификатов» и «Власть» и нажмите «Импорт», он ожидает сертификат. Если вы перейдете на вкладку «Ваши сертификаты», он ожидает P12, потому что P12 будет содержать закрытый ключ а также для проверки подлинности вашей личности на другом сервере. – gtrig

+0

@g trig Спасибо за подробный комментарий gtrig. Я пытаюсь добиться того, что я предоставляю сертификат пользователю (клиенту), который имеет закрытый и открытый ключ. Он устанавливает этот ceritificate в своем браузере, и когда мое приложение запускается, я получаю это и использую для шифрования и дешифрования данных. Пожалуйста, дайте мне несколько советов. Я не могу двигаться с этого момента. –

+0

@SURESH Похоже, вам действительно нужен секретный ключ. Я не совсем понимаю, как ваше приложение взаимодействует с хранилищем ключей браузера. Ваше приложение работает на его сервере (тот же сервер, на котором работает его браузер?) Или ваше приложение работает на другом сервере, к которому подключен его браузер? – gtrig

ответ

1

Я просмотрел ваш код, и я думаю, что проблема заключается в том, что вы выдаете сертификат в необработанном двоичном формате DER, используя сертификат.getEncoded(), когда браузер ожидает формат PKCS # 12. Я никогда не делал этого программно, я всегда использовал keytool или openssl для преобразования между форматами, поэтому я не могу больше помочь.

eta: объясняет, как создавать, подписывать и экспортировать PKCS12 в java: http://www.mayrhofer.eu.org/create-x509-certs-in-java (обратите внимание: это старое сообщение и требует bouncycastle и немного взлома :(- современная версия bouncycastle может просто предоставить эту функцию)

+0

Спасибо за подсказку, я посмотрю в этом направлении. Только началось с криптографии –

+0

Удачи. Работа с PKI может быть кошмаром: D – tom

+0

объясняет, как вывести PEM, который, как я думал, будет потребляться браузером: http://stackoverflow.com/questions/3313020/write-x509-certificate-into-pem- formatted-string-in-java (header, base64encodedbytes, footer) – tom