为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Scala 或 Java 将 .p12 转换为 .pem 以在 AWS SNS 中注册

使用 Scala 或 Java 将 .p12 转换为 .pem 以在 AWS SNS 中注册

繁星coding 2023-06-21 15:07:33
我正在尝试在 SNS 中注册我的移动应用程序。Amazon API 需要 .pem 格式的 APNS 证书及其密码。我收到 p12 格式的证书二进制文件。我怎样才能以正确的方式转换它?或者我真的需要转换它吗?这就是我到目前为止所得到的:/** * @param principal For APNS, is certificate in .pem format. * @param credential For APNS, is private key. * @param platform APNS of FCM * @param appName the application name   */def registerApp(principal: String, credential: String, platform: String, appName: String): String = {val attributes = Map("PlatformPrincipal" -> principal, "PlatformCredential" -> credential)val map = mapAsJavaMap(attributes.asInstanceOf[util.Map[String, String]])val request = new CreatePlatformApplicationRequest()  .withPlatform(platform)  .withName(appName)  .withAttributes(map)amazonSNSClient.createPlatformApplicationAsync(request).get().getPlatformApplicationArn 我做了一些研究,但无法找到非常简单的东西。我也无法使用控制台keytool。我基本上需要的是实现这个的东西openssl pkcs12 -in myFile.p12 -out myFile.pem -nodes在 Java 的 Scala 中,但使用输入二进制。
查看完整描述

3 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

您不需要 Bouncycastle 来读取 PKCS12,基本的 Java 加密就可以做到这一点。Bouncycastle 确实提供了完整且(大部分)方便的 PEM 函数,基本的 Java 没有这些函数,但是您在这里需要的特定函数并不难合成:


static void SO57695413PKCS12ToPEM (String[] args) throws Exception {

    KeyStore ks = KeyStore.getInstance("PKCS12"); 

    ks.load(new FileInputStream(args[0]), args[1].toCharArray());

    // should close but I'm being lazy here

    PrivateKey pkey = (PrivateKey) ks.getKey(args[2], args[1].toCharArray());

    Certificate cert = ks.getCertificate(args[2]);

    // or loop over/look at aliases if desired

    System.out.print("-----BEGIN PRIVATE KEY-----\r\n"

            + Base64.getMimeEncoder().encodeToString(pkey.getEncoded())

            + "\r\n-----END PRIVATE KEY-----\r\n");

    System.out.print("-----BEGIN CERTIFICATE-----\r\n"

            + Base64.getMimeEncoder().encodeToString(cert.getEncoded())

            + "\r\n-----END CERTIFICATE-----\r\n");

    // or put in a String etc as desired

}


查看完整回答
反对 回复 2023-06-21
?
噜噜哒

TA贡献1784条经验 获得超7个赞

我无法与 SNS 对话,或者如果您不需要转换它,但就转换它而言,我认为最好的方法是使用 OpenSSL。

查看完整回答
反对 回复 2023-06-21
?
狐的传说

TA贡献1804条经验 获得超3个赞

我发现将 p12 的字节数组转换为 pem 并获取 PlatformPrincipal 和 PlatformCredential 进行注册的解决方法:


def registerApnsApp(p12cert: Array[Byte], password: String, appName: String): Future[String] = {

  val p12 = fromP12(new ByteArrayInputStream(p12cert), password).get

  val attributes = Map("PlatformPrincipal" -> fromPem(p12.certificate), "PlatformCredential" -> fromPem(p12.privateKey))

  val attributesMap = mapAsJavaMap(attributes)


  val request = new CreatePlatformApplicationRequest()

    .withPlatform("APNS")

    .withName(appName)

    .withAttributes(attributesMap) 


    Future(amazonSnsClient.createPlatformApplicationAsync(request).get().getPlatformApplicationArn)

  }

获取在 SNS 中用作 PlatformPrincipal 的证书以及 PlatformPrincipal 的密钥。


 def fromP12(stream: InputStream, password: String): Option[Pkcs12] = {

   val pkcs12 = KeyStore.getInstance("pkcs12", new BouncyCastleProvider())

   pkcs12.load(stream, password.toCharArray)

   while(pkcs12.aliases().hasMoreElements) {

     val alias = pkcs12.aliases().nextElement()

     if (pkcs12.isKeyEntry(alias)) {

       val certificate = pkcs12.getCertificate(alias)

       val privateKey = pkcs12.getKey(alias, password.toCharArray).asInstanceOf[PrivateKey]

       if (privateKey != null && certificate != null) {

        Option(new Pkcs12(certificate, privateKey, alias))

       }

     }

   }

   None

  }

}


def fromPem(obj: Object): String = {

  val out = new StringWriter

  val pem = new PEMWriter(out)

  pem.writeObject(obj)

  pem.close()

  out.getBuffer.toString

}

需要重构/美化,但希望这能帮助某人正确转换 p12 并注册 APNS 应用程序。


使用了进口:


import java.io.{InputStream, StringWriter}

import java.security.{KeyStore, PrivateKey}

import java.security.cert.Certificate


import org.bouncycastle.jce.provider.BouncyCastleProvider

import org.bouncycastle.openssl.PEMWriter


查看完整回答
反对 回复 2023-06-21
  • 3 回答
  • 0 关注
  • 169 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信