2017-01-03 5 views
1

를 디코딩하는 방법 다음은 내 요구 사항입니다 :자바 - Base64로 인코딩 된 인증서

  1. 프로그램은 3 개 태그를 입력으로 XML 파일을해야합니다 :합니다. 이 모든 데이터는 Base64로 인코딩됩니다. 참고 : 프로그램
  2. 프로그램을 디코딩하고 Base64로 디코딩 및 다른 파일 아래

에 기록해야한다

  • 검증 데이터를 서명 및 인증서를 사용하여 인증에 대한 데이터를 확인해야 BC 단지를 사용하고

  • public void executeTask(InputStream arg0, OutputStream arg1) throws SomeException{ 
    try{ 
        BufferedReader br = null; 
        br = new BufferedReader(new InputStreamReader(arg0)); 
        String orgContent = "", splitData = "", signContent = "", certContent = ""; 
    
        DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
        DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); 
        Document doc = docBuilder.parse(arg0); 
        doc.getDocumentElement().normalize(); 
    
        NodeList originalContent = doc.getElementsByTagName("OrgContent"); 
        Element originalElement = (Element)originalContent.item(0); 
        NodeList textOrgContent = originalElement.getChildNodes(); 
        orgContent = ((Node)textOrgContent.item(0)).getNodeValue().trim(); 
    
        NodeList signature = doc.getElementsByTagName("Signature"); 
        Element signatureElement = (Element)signature.item(0); 
        NodeList signatureContent = signatureElement.getChildNodes(); 
        signContent = ((Node)signatureContent.item(0)).getNodeValue().trim(); 
    
        NodeList certificate = doc.getElementsByTagName("Certificate"); 
        Element certificateElement = (Element)certificate.item(0); 
        NodeList certificateContent = certificateElement.getChildNodes(); 
        certContent = ((Node)certificateContent.item(0)).getNodeValue().trim(); 
        String decodedCertContent = new String(Base64.decode(certContent),StandardCharsets.UTF_8); 
        byte[] certByteValue = Base64.decode(certContent); 
        CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); 
        System.out.println("certContent:\n" + new String(certByteValue,StandardCharsets.UTF_8)); 
        InputStream inputStream = new ByteArrayInputStream(Base64.decode(certContent)); 
    
        X509Certificate cert = (X509Certificate)certFactory.generateCertificate(inputStream); 
    
        arg1.write(decodedOrgData.getBytes()); 
        arg1.flush(); 
    } 
    catch (ParserConfigurationException e){ 
        e.printStackTrace(); 
    } 
    catch (IOException e){ 
        e.printStackTrace(); 
    } 
    catch (org.xml.sax.SAXException e){ 
        e.printStackTrace(); 
    } 
    catch (CertificateException e){ 
        e.printStackTrace(); 
    } 
    

    }

    ,536,913,632 : 인증서를 해독하려고 내 코드입니다 10

    새 문자열 (certByteValue, StandardCharsets.UTF_8)의 값을 인쇄하면 인식 할 수없는 텍스트가 인쇄되고 있습니다. 코드 X509Certificate cert = (X509Certificate)certFactory.generateCertificate(inputStream);의 마지막 줄을 실행할 때 java.security.cert.CertificateException이 발생합니다 : 인증서를 파싱 할 수 없습니다 : java.io.IOException : BER/DER 데이터가 잘못되었습니다 (너무 큰 경우).

    저는이 인증서에 대한 신참이기 때문에 교착 상태에 빠졌습니다. 나는 그 요구 사항을 진행할 수 없다. 위의 요구 사항을 달성하는 방법을 알고 싶습니다.

    위의 코드에 대한 입력 스트림은 xml 파일입니다. 또 다른 프로그램은 서명과 인증서가있는 base64로 인코딩 된 데이터가있는 xml 파일을 만듭니다. 이 프로그램에서, 상기 증명서를 인코딩하기위한 아래의 코드가 사용된다 : 가변 encodedStringCert는 태그 안에 인증 값으로 전달된다

     KeyStore keyStore = KeyStore.getInstance("JKS"); 
        keyStore.load(new FileInputStream("Filepath/certificate.p12"), "password".toCharArray()); 
        PrivateKey privateKey = (PrivateKey)keyStore.getKey(alias, "password".toCharArray()); 
    
         CertificateFactory factory = CertificateFactory.getInstance("X.509"); 
         X509Certificate certificate = (X509Certificate) factory.generateCertificate(new FileInputStream("D:/Sujai/Implementation Team/PI/Axis Treds/Certificates/PI_7.5_Cert/Arteria_Certificate-cert.cert")); 
        byte[] encodedCert = certificate.getEncoded(); 
        String encodedStringCert = new String(Base64.encode(new String(encodedCert).getBytes(StandardCharsets.UTF_8))); 
    

    . 이 질문 맨 위에 공유되는 프로그램에서이 인증서 값을 디코딩해야합니다.

    샘플 인증서 내용 : ----- BEGIN CERTIFICATE ----- MIIDBjCCAe6 .... IM1g == ----- END의 CERTIFICATE -----

    답변

    1

    new String(certByteValue,StandardCharsets.UTF_8) 실패 인증서로 인코딩 된 데이터가 문자열로 표현할 수 없으므로

    원본 데이터가 base64 X509 인증서 또는 라이브러리 Base64.decode()의 인코딩 문제가 아닌 것일 수 있습니다. 내가 8 Base64.getDecoder().decode() 또는 자바도> 6

    확인 base64로 인코딩 된 인증서를 해독하기 위해이 작업 코드 DataTypeConverter.parseBase64Binary()

    String certB64 = "MIIHFDCCBfygAwIBAgIIK2o4sL7KHQgwDQYJKoZIhvcNAQELBQAwSTELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRlcm5ldCBBdXRob3JpdHkgRzIwHhcNMTYxMjE1MTQwNDE1WhcNMTcwMzA5MTMzNTAwWjBmMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEVMBMGA1UEAwwMKi5nb29nbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEG1y99TYpFSSiawnjJKYI8hyEzJ4M+IELfLjmSsYI7fW/V8AT61quCswtBMikJYqzYBZrV2Reu5sHlLr6936cR6OCBKwwggSoMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjCCA2sGA1UdEQSCA2IwggNeggwqLmdvb2dsZS5jb22CDSouYW5kcm9pZC5jb22CFiouYXBwZW5naW5lLmdvb2dsZS5jb22CEiouY2xvdWQuZ29vZ2xlLmNvbYIWKi5nb29nbGUtYW5hbHl0aWNzLmNvbYILKi5nb29nbGUuY2GCCyouZ29vZ2xlLmNsgg4qLmdvb2dsZS5jby5pboIOKi5nb29nbGUuY28uanCCDiouZ29vZ2xlLmNvLnVrgg8qLmdvb2dsZS5jb20uYXKCDyouZ29vZ2xlLmNvbS5hdYIPKi5nb29nbGUuY29tLmJygg8qLmdvb2dsZS5jb20uY2+CDyouZ29vZ2xlLmNvbS5teIIPKi5nb29nbGUuY29tLnRygg8qLmdvb2dsZS5jb20udm6CCyouZ29vZ2xlLmRlggsqLmdvb2dsZS5lc4ILKi5nb29nbGUuZnKCCyouZ29vZ2xlLmh1ggsqLmdvb2dsZS5pdIILKi5nb29nbGUubmyCCyouZ29vZ2xlLnBsggsqLmdvb2dsZS5wdIISKi5nb29nbGVhZGFwaXMuY29tgg8qLmdvb2dsZWFwaXMuY26CFCouZ29vZ2xlY29tbWVyY2UuY29tghEqLmdvb2dsZXZpZGVvLmNvbYIMKi5nc3RhdGljLmNugg0qLmdzdGF0aWMuY29tggoqLmd2dDEuY29tggoqLmd2dDIuY29tghQqLm1ldHJpYy5nc3RhdGljLmNvbYIMKi51cmNoaW4uY29tghAqLnVybC5nb29nbGUuY29tghYqLnlvdXR1YmUtbm9jb29raWUuY29tgg0qLnlvdXR1YmUuY29tghYqLnlvdXR1YmVlZHVjYXRpb24uY29tggsqLnl0aW1nLmNvbYIaYW5kcm9pZC5jbGllbnRzLmdvb2dsZS5jb22CC2FuZHJvaWQuY29tghtkZXZlbG9wZXIuYW5kcm9pZC5nb29nbGUuY26CBGcuY2+CBmdvby5nbIIUZ29vZ2xlLWFuYWx5dGljcy5jb22CCmdvb2dsZS5jb22CEmdvb2dsZWNvbW1lcmNlLmNvbYIKdXJjaGluLmNvbYIKd3d3Lmdvby5nbIIIeW91dHUuYmWCC3lvdXR1YmUuY29tghR5b3V0dWJlZWR1Y2F0aW9uLmNvbTALBgNVHQ8EBAMCB4AwaAYIKwYBBQUHAQEEXDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3J0MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9vY3NwMB0GA1UdDgQWBBThPf/3oDfxFM/hdOi5kLv8qrZbsjAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEvMCEGA1UdIAQaMBgwDAYKKwYBBAHWeQIFATAIBgZngQwBAgIwMAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL3BraS5nb29nbGUuY29tL0dJQUcyLmNybDANBgkqhkiG9w0BAQsFAAOCAQEAWZQy0Kvn9cPnIh7Z4kfUCXX/dhdvjLJYFAn3b3d5DVs1BLYuukfIjilVdAeTUHZH7TLn/uVejg3yS0ssRg1ds1iv2O9DJbnl5FHcjNAvwfN533FulWP41OC6B6dC6BGGTXTvQobDup7/EKg1GWX9ksBtTfKLH5wrjhN955Itnd25Sjw2bSjLaWEtTrjINXmnBoc2+qHFzF/fNxK1KbmkBboUIGoaGsThe3AF0Ye+XAeaZH08+GdrorknlHDQLLtHIcJ3C6PrQ/kTpwWd/TVXW42BN+N7xZiGJbvKOg0S0rk2hzhgX4QoUKZHMqqh1sS6ypkfnWx75nh325y4Tenk+A=="; 
    byte encodedCert[] = Base64.getDecoder().decode(certB64); 
    ByteArrayInputStream inputStream = new ByteArrayInputStream(encodedCert); 
    
    CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); 
    X509Certificate cert = (X509Certificate)certFactory.generateCertificate(inputStream); 
    

    나는 당신의 인증서가 태그가없는 가정 자바의 표준 디코더를 사용하는 것이 좋습니다 ----- BEGIN CERTIFICATE ---------- END CERTIFICATE -----

    편집을 할

    당신은 직접,186,855을로드 할 수 있습니다base64 PEM으로 인코딩 된 파일 (-----BEGIN CERTIFICATE----- 태그 포함).

    FileInputStream inputStream = new FileInputStream (pathToYourCert); 
    CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); 
    X509Certificate cert = (X509Certificate)certFactory.generateCertificate(inputStream); 
    
    +0

    이 태그가 있습니다. 좀 더 확장적 일 것입니다 : \t 다음은 코드에서 얻는 입력을 생성하는 코드입니다. encodedStringCert string은 내 프로그램을위한 입력입니다 :'code'CertificateFactory factory = CertificateFactory.getInstance ("X.509"); \t X509 인증서 인증서 = (X509Certificate) factory.generateCertificate (새 FileInputStream ("FilePath/cert.cert"))); \t \t 바이트 [] encodedCert = certificate.getEncoded(); \t \t 문자열 encodedStringCert = 새 문자열 (Base64.encode (새 문자열 (encodedCert) .getBytes (StandardCharsets.UTF_8))); 코드; – Sujaikareik

    +0

    위의 잘못된 형식은 죄송합니다. 내가 새로 왔기 때문에 여기서 형식을 알 수 없다. – Sujaikareik

    +0

    이 코드로 질문을 업데이트하는 것이 좋습니다. 이전과 다릅니다. Base64 PEM으로 인코딩 된'.cer' ('----- BEGIN CERTIFICATE -----'태그)에서 인증서를로드 할 수 있습니다. 주석에 게시 한 코드를 사용하십시오. 그러나이'new String (encodedCert) .getBytes (StandardCharsets.UTF_8)'는 할 수 없습니다. 해결책은 – pedrofb

    관련 문제