使用开发证书连接到生产APNs

6

我正在使用以下 Ruby 代码来接收 APNs 在推送失败时返回的错误信息:

if IO.select([ssl], nil, nil, 5)
    read_buffer = ssl.read(6)
    process_error_response(read_buffer)
end

我注意到一种奇怪的情况,在使用IO.select时结果为非空,但read_buffer返回一个空字符串。经过调试后,我发现这会在使用开发APNs证书连接到gateway.push.apple.com时发生,而如果使用生产证书连接到gateway.sandbox.push.apple.com也会出现相同情况。
是否有任何程序上的方法可以检测到这种情况?比如,如果用户提供了推送证书并告知它是生产/开发环境,但无法在苹果开发者网站上验证该事实,是否有办法检测?我本以为连接会被拒绝,但实际上似乎会建立连接但处于部分损坏的状态。
3个回答

0
一种方法是打开证书并检查主题,例如:
require 'openssl'
def production?(cert_path)
  certificate = ::OpenSSL::X509::Certificate.new(File.read(cert_path))
  !certificate.subject.to_s.include?('Development')
end

对于生产证书,主题看起来像:

"Apple Production IOS Push Services: com.mybundle.app..."

对于开发证书,它看起来像:

"Apple Development IOS Push Services: com.mybundle.app..."

0

虽然这不是检查证书是否有效的方法,但您可以检查它以确定它是开发或生产证书。开发证书中会包含“Developer”字符串,而生产证书中会包含“Production”字符串。


0

我刚刚使用证书从命令行直接发送给了自己...

当使用开发证书时,我看到:

api.development.push.apple.com

我没有使用生产证书进行测试,但我非常确定当您使用生产证书发送时,您将看到以下内容:

api.push.apple.com

就算是在一个没有使用分发证书签名的开发环境中,只要两个环境具有相同的 bundleId,生产证书也可以在生产环境中使用。但是,在使用分发证书签名的应用程序的生产环境中,生产证书将无法使用。

除此之外,现在更安全的方式是不使用证书,而是使用密钥/令牌机制。请参见这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接