Ошибка сертификата 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);
Спасибо.
Ответы
Ответ 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 начнет красиво. Понятия не имею, почему это работает. Чувствует себя грязным