在Android上读/写证书签名请求(spongycastle)

时间:2017-07-21 06:50:39

标签: java android certificate csr spongycastle

我尝试在Android上编写代码以生成RSA密钥对,然后生成证书请求文件(.csr),如下图所示: enter image description here

  1. Fisrt我使用spongycastle lib生成密钥对(公钥和私钥)

    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
    keyPairGenerator.initialize(1024,new SecureRandom());
    KeyPair keyPair = keyPairGenerator.generateKeyPair();
    publicKey = keyPair.getPublic();
    privateKey = keyPair.getPrivate();
    
  2. 2然后我使用CSRHelper上的byte CSRder[]课程来生成: byte CSRder[] = csr.getEncoded();

    File file;
    FileOutputStream outputStream;
    try
    {
        file = new File(getCacheDir(),"csr.txt");
        outputStream = new FileOutputStream(file);
        outputStream.write(CSRder);
        outputStream.close();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    
    1. 我编写代码将byte []写入文件:

      BufferedReader input = null;
      File file = null;
      try {
         file = new File(getCacheDir(), "csr.txt"); // Pass getFilesDir() and "MyFile" to read file
      
          input = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
          String line;
          StringBuffer buffer = new StringBuffer();
          while ((line = input.readLine()) != null) {
                buffer.append(line);
          }
          Log.d(TAG, buffer+"");
      
      } catch (IOException e) {
          e.printStackTrace();
      }
      
    2. 最后我写代码再次读取文件:

          07-21 13:48:35.163 16157-16157/com.example.napoleon.test_2 D/MainActivity: 0��0���0;10Unapoleon.com10UAralink10UOrgUnit0��0 *�H��������0�������Qt��G�]�ܪ�0�'�I^�Q��[�r5ڢ_!|������ZC��~<��*o�?�d+-����)��V�<߹��m��(��ѐxDcx��NhƬF��Ҵvq+���0�Iq�-Eoe,���"0     *�H��   100U�0�0    *�H���������YPT3��?��P5MY��hs)��$1Gv�r_��76ߞ;���ҽ�޼ t�kI�I��Z��tg����O�W��Gt�=���V���#G1�$z�$�V����_^7_x�?�0�׵#�;��f?�
      
    3. 但我的logcat显示不可读的字符。

      let triggerWeekly = Calendar.current.dateComponents([.weekday,.hour,.minute], from: now)
      

      如何将此csr字节写入文件并再次读取? 感谢提前。

1 个答案:

答案 0 :(得分:2)

CSRder是二进制文件,您无法将其作为字符串读取,因为它具有不可打印的字符。

由于您需要.csr文件的PEM格式,因此需要将二进制内容转换为base64并添加PEM页眉和页脚

----BEGIN CERTIFICATE REQUEST-----
(base64)
----END CERTIFICATE REQUEST-----

这可以手动完成或使用spongycastle的PEMWriter

StringWriter writer = new StringWriter();
PemWriter pemWriter = new PemWriter(writer);
pemWriter.writeObject(new PemObject("CERTIFICATE REQUEST", CSRder));
pemWriter.flush();
pemWriter.close();
String csrPEM = writer.toString();

在此之后,您可以将csrPEM保存为字符串文件。