Подтвердить что ты не робот

Ошибка сертификата APNS Java с "DerInputStream.getLength(): lengthTag = 109, слишком большая".

Когда я пытаюсь использовать java APNS для отправки push-уведомления в iOS, я получил это сообщение об ошибке:

com.notnoop.exceptions.InvalidSSLConfig: java.io.IOException: DerInputStream.getLength(): lengthTag = 109, слишком большой.

Я уже пытаюсь преобразовать сертификат в Personal Information Exchange (.p12), также получая ту же ошибку. Кто-нибудь знает проблему и как ее решить?

Вот мой код java:

ApnsService service =
    APNS.newService()
   .withCert("src/net/notification/ck.jks", "******")
   .withSandboxDestination()
   .build();

String payload = APNS.newPayload().alertBody(record.getSendMsg()).build();
String token = record.getToken();
service.push(token, payload);

Спасибо.

4b9b3361

Ответ 1

У меня была такая же проблема, но мое решение поможет вам, только если вы используете maven.

Фильтрация ресурсов Maven (позволяющая включать переменные в файлы ресурсов) может испортить ваши двоичные файлы - и сертификаты особенно чувствительны к модификации.

В общем случае двоичный контент не следует фильтровать. Но я не мог просто отключить фильтрацию ресурсов, потому что у меня есть некоторые файлы .properties, которые включают переменные. Таким образом, решение было исключить файлы .p12 из фильтрации.

<build>
    [...]
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <excludes>
                <exclude>**/*.p12</exclude>
            </excludes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>false</filtering>
            <includes>
                <include>**/*.p12</include>
            </includes>
        </resource>
    </resources>
    [...]
</build>

Подробнее о фильтрации ресурсов maven: http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html

Ответ 2

Это происходит потому, что система думает, что вы пытаетесь прочитать другой тип хранилища ключей, а не JKS. Вам нужно будет указать, что файл JKS или преобразовать его в другой формат.

Я вижу, что вы уже пытались преобразовать в .p12. Если вы сделали это правильно, возможно, есть другой формат по умолчанию. Я рекомендую узнать, как указать JKS.

Ответ 3

Если вы используете maven, это, вероятно, происходит из-за фильтрации Maven во всей папке ресурсов. Я пробовал решение Zsolt Safrany выше и не работал. Однако, прочитав документацию, которую он поделил, я нашел это:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-resources-plugin</artifactId>
  <version>3.0.1</version>
  <configuration>
    <nonFilteredFileExtensions>
      <nonFilteredFileExtension>p12</nonFilteredFileExtension>
    </nonFilteredFileExtensions>
  </configuration>
</plugin>

Это исключает возможность отфильтровывания двоичных расширений (или любого расширения, которое вы хотите).

Ответ 4

У меня была эта проблема, и я понял, что проблема в том, что truststore.p12 на самом деле в JKS или поврежден.

Команда keytool для проверки склада доверенных сертификатов на соответствие PKCS12:

keytool.exe -keystore truststore.p12 -storepass passwordText -list -storetype pkcs12
keytool error: java.io.IOException: DerInputStream.getLength(): lengthTag=109, too big.

Я смог исправить это, выполнив принудительное преобразование JKS в PKCS12.

Со следующей инструкцией:

 keytool.exe -importkeystore -srckeystore truststore.jks  -destkeystore truststore1.p12 -srcstoretype JKS -deststoretype PKCS12

Чем успешный тест даст что-то вроде:

keytool.exe -keystore truststore.p12 -storepass passwordText -list -storetype pkcs12


Keystore type: PKCS12
Keystore provider: SunJSSE

Your keystore contains 3 entries

certificates-4, 9 Jul, 2019, trustedCertEntry,
Certificate fingerprint (SHA1): CF:E3:01:1F:A3:30:C5:B1:B9:2B:C5:28:1B:8C:66:71:EA:B8:67:0D
certificates-3, 9 Jul, 2019, trustedCertEntry,
Certificate fingerprint (SHA1): 62:52:DC:40:F7:11:43:A2:2F:DE:9E:F7:34:8E:06:42:51:B1:81:18
certificates-2, 9 Jul, 2019, trustedCertEntry,
Certificate fingerprint (SHA1): FA:5F:98:E8:02:2E:81:05:DB:DF:24:48:65:6A:E5:76:C1:31:CB:28

Ответ 5

В моем случае я обнаружил, что что-то случайно изменило системное свойство javax.net.ssl.trustStore. Свойство отладки SSL -Djavax.net.debug=ssl:trustmanager мне очень помогло в расследовании.

Ответ 6

Удалить строку keystoreType

Я не знаю, ПОЧЕМУ это работает. Но если у меня есть этот line in my server.xml '..

keystoreType="PKCS12"

... тогда Tomcat НЕ запустится и выдаст мне ошибку DerInputStream.getLength(): lengthTag=109, too big.

Но если я УДАЛЮ эту строку, то Tomcat начнет красиво. Понятия не имею, почему это работает. Чувствует себя грязным