2017年2月13日 星期一

LINE bot webhook 回應SSL certificate is invalid

這次遇到一件奇怪的事情
之前透過ssl for free申請的ssl cert設定好之後
讓瀏覽器開啟https有成功的認證網站具有合法的ssl cert
但是把網址填入LINE bot的webhook url,LINE bot的測試結果會回傳SSL certificate is invalid

筆者先把先前透過ssl for free申請的憑證從DSM中移除之後透過DSM6內建的功能去Let's Encrypt申請一張新的憑證後即可讓LINE bot驗證成功
目前不清楚發生原因,可能的原因也許是之前申請時是使用Web Station+虛擬主機的方式,而實際使用時是用反向代理+web service in docker的方式造成驗證不符合?



2017/03/02 update:
透過DSM新申請的憑證當下是可以驗證成功,但是過了一段時間之後一樣會發生同樣的問題。
目前推測是因為使用ddns的domain,懷疑也許dns cache使得LINE bot解析到錯誤的ip導致驗證失敗。
筆者現在改成使用固定ip就可以成功驗證,目前還在持續觀察這個問題。

6 則留言:

  1. Hi, 我也是用sslforfree.com來弄憑證(最後也是Let's Encrypt簽發),同樣的在瀏覽器開啟網址是合法的,但LINE bot的webhook url verify卻都無法通過。
    一樣是透過DSM的內建反向伺服器(nginx)將https導向內部的flask,不過我是用內建的xxx.myds.me domain來try,不曉得能不能找您的方法改用dsm內建功能再去申請新的憑證

    回覆刪除
    回覆
    1. 你好,關於重新申請ssl cert的部分。剛申請後新的ssl cert確實能讓LINE bot驗證成功,但是過了一段時間之後此份ssl cert又發生同樣驗證不過的問題。
      因為我目前使用的是ddns的domain,目前懷疑也許dns cache使得LINE bot解析到錯誤的ip導致驗證失敗。
      現在我是改成使用固定ip就可以成功驗證,目前還在觀察這個問題。

      刪除
  2. 我也遇到這問題,動態的網址Let's Encrypt申請都沒問題網頁也沒問題,Line難道會更嚴格?!感覺很奇怪,後來找到一篇文有提到某些服務是無法自動下載CA,我是用 Node-red ,一般只用了certificate.crt private.key ,於是把ca_bundle.crt 的憑證也弄上去,竟然就過了....

    回覆刪除
    回覆
    1. gavin hsu 回應的內容幫助到我,感恩

      刪除
  3. 作者已經移除這則留言。

    回覆刪除
  4. 我的測試結果:

    var privateKey = fs.readFileSync('sslcert/private.key', 'utf8');
    var certificate = fs.readFileSync('sslcert/certificate.crt', 'utf8');
    var credentials = {key: privateKey, cert: certificate};
    //失敗
    var privateKey = fs.readFileSync('sslcert/private.key', 'utf8');
    var certificate = fs.readFileSync('sslcert/certificate.crt', 'utf8');
    var cafile = fs.readFileSync('sslcert/ca_bundle.crt','utf-8');
    var credentials = {ca:cafile, key: privateKey, cert: certificate};
    //失敗

    var privateKey = fs.readFileSync('sslcert/private.pem', 'utf8');
    var certificate = fs.readFileSync('sslcert/certificate.pem', 'utf8');
    var cafile = fs.readFileSync('sslcert/ca_bundle.pem','utf-8');
    var credentials = {ca:cafile, key: privateKey, cert: certificate};
    var app = express();

    var linebotParser = bot.parser();
    app.post('/', linebotParser);
    var server = https.createServer(credentials, app).listen(8080, function() {
    ...
    }
    //這樣就成功了

    回覆刪除