跳到主要內容

文章

利用Node.js建立Https協定服務

因為有些外掛模組需要有https才能啟用,所以需要建立一個https Node.js。

https預設是443 port,傳輸過程中會加密,所以需要有CA憑證,而CA有Signed CA和Self-Signed CA,
前者憑證可被Root CA認證,適用於商業性質,但是通常需要付費,瀏覽器會標示綠標,也就是安全的網站;
後者不需Root CA認證,以自行發行憑證的方式進行,但是會被瀏覽器視為不安全的網站。

我因為只需要開發中有https的服務,所以採取簡單的方式,方式如下:


1、建立certificate檔案

產生RSA加密的私鑰,-out代表輸出私鑰的檔名,1024代表私鑰長度,如需更安全可以設定2048。
# openssl genrsa -out privatekey.pem 1024

建立憑證要求,-new為表示要產生CSR(certificate signing request),-key為讀取的私鑰,後面為私鑰檔,無指定則會產生一把新的私鑰。
用產生的私鑰產生一把用來生成證書的鑰匙。
# openssl req -new -key privatekey.pem -out csrreq.csr

X.509是一種公開金鑰(PKI) 的電信通訊標準,所以我們利用X.509產生一個CA簽證的憑證。
-days:生效的期限,預設為30天
-in:CSR憑證檔名
-signkey:私鑰檔
-out:產生的憑證檔名
# openssl x509 -req -days 9999 -in csrreq.csr -signkey privatekey.pem -out ca.pem


2、編輯JS如以下的檔案

const fs = require('fs');
const https = require('https');
const express = require('express');
const app = express();

//讀取憑證及金鑰
const prikey = fs.readFileSync('privatekey.pem', 'utf8');
const cert = fs.readFileSync('csrreq.pem', 'utf8&…

chrome for android 開發人員遠端除錯

為了測試無密碼登入的功能,試寫了一個簡易的網頁,採用WebAuthn技術。

在桌機上的Chrome測試時,成功出現使用USB安全金鑰登入的畫面,可是我沒有金鑰,只好以手機來測試,也成功出現使用金鑰或指紋來登入的畫面。

但是我想用console.log來輸出一些object等訊息,但是桌機的Chrome因為無硬體金鑰,所以無法繼續,故也秀不出之後的console log;而用手機的Chrome是叫不出開發人員選項,所以也無秀不出console log。

之後找到一篇遠程調試 Android 設備的文章,可以利用桌機的Chrome來遠端對Android的Chrome進行除錯,故記錄我的步驟,方便使用。

手機Chrome版本:81、桌機Chrome版本:80

1、啟用紅米手機的開發人員模式,並將「USB調試」功能打開

2、將手機與桌機用USB線串在一起,並開啟手機的Chrome

3、開啟桌機Chrome的開發人員模式(F12),點選 Remote devices



4、在新增的頁籤「Remote devices」點選下圖紅色圈選處的連結,開啟新頁面



5、確定「Discover USB devices」有勾選;有成功連上手機就會出現下列圈選的機碼



6、offline代表未認證,打開手機(我的是紅米)畫面出現需要確認的畫面,確認它。

7、手機確認後就offline就會變成online,並且看見手機上Chrome



8、直接在手機上操作或在「Open tab with url」輸入url,如上圖我已開啟ngrok.io的測試網頁,按下「inspect」,就可以遠端對手機Chrome進行除錯。



測試WebAuthn出現錯誤: Cannot read property 'create' of undefined

這幾天在測試WebAuthn,參考網路上的範例試作時,產生憑證卻出現下列的錯誤:



原先以為是程式或瀏覽器版本的問題,但是檢查後一直無法解決這個問題,最後在一個論壇的一段回答中找到答案,也許是我沒有去詳閱原文的技術文件,所以我一直找不到原因。

原因是我沒有使用https或localhost來執行,使用ngrok臨時建立一個https後再測試,這次就成功了,記錄一下。




ngrok快速讓外網連本機服務

每次在測試Web網站或Webhook時都需要設定防火牆讓外網可以連線到內部的服務,但是有時候只想測試一下外網連線的狀態時,可用ngrok來快速達到此一目標。

Ngrok 是一個反向代理,可以在公共的端點和本地服務之間建立一個安全的通道,啟動或停用都非常快速,而且無需設定防火牆。

先由Ngrok下載程式到自己的電腦上。Ngrok官網:https://ngrok.com/

例如我的Service是http://localhost:7777,首先開啟CMD並進入Ngrok的目錄內
D:/> cd ngrok

執行下列指令讓Port 7777可以穿透:
D:/ngrok> ngrok http 7777



ngrok提供了一組隨機的url,並且啟用了http及https,所以外網測試時只能填上提供的url就可以了。



ngrok也支援TLS、TCP Tunnel的方式,網站上還提供了免費與付費會員服務,可以取得更多的服務



Git 中文亂碼 for Windows

如果使用的是圖形介面的Git管理工具,則中文顯示沒有問題,有問題的是命令列(CMD)上中文顯示的問題。

1、中文檔名亂碼
中文檔名在Git的使用上並沒有問題,只是在顯示時出現下列紅色部份的亂碼



設定git內部的參數即可正常顯示中文:
$ git config --global core.quotepath false



2、內容中文亂碼

在比對內容或查看log記錄時,中文亂碼如下





可以設定變數來解決,唯該變數並非系統環境變數,所以每次重開CMD都需要再設定一次
如果想一勞永逸,可以設定在系統的環境變數PATH內。

C:\> set LC_ALL=C.UTF-8





python 3 無法使用pip安裝套件(WIN 10)

其實預設都會幫我們安裝pip這個管理套件,但是我在安裝完python 3.7後卻無法使用pip來安裝套件。

查詢是否已經有安裝pip:

C:\> python -m pip --version

pip 20.0.2 from C:\Python37\lib\site-packages\pip (python 3.7)

上面顯示我已有安裝pip,版本是20.0.2

如果沒有pip沒有被安裝,可先下載get-pip.py後,以cmd在檔案所在的目錄下執行python get-pip.py
https://bootstrap.pypa.io/get-pip.py

即然我已有安裝pip,那無法執行的原因就有可能是環境變數PATH。

由上面可以得知pythond的安裝目錄在C:\Pyhton37,所以pip的執行檔會C:\Python37\Scripts



將路徑設定到PATH後就可以了。
set PATH=C:\Python37\Scripts;%PATH%

Python套件cx_Oracle出現UnicodeEncodeError: 'ascii' codec錯誤

原本我的電腦已有python腳本連線Oracle資料庫並取得資料,當時是用python 2.7來執行,沒有什麼問題。

最近重灌系統之後,安裝Python 3.7、cx_Oracle套件、Oracle instant client 11.2,都是64位元的版本。

重新執行腳本時卻出現如下的錯誤訊息:
Database Version:11.2.0.4.0
Traceback (most recent call last):
  File "F:\Ora_LineNotify\EBS_Check.py", line 107, in <module>
    cur.execute(SQL02)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 45-46: ordinal not in range(128)

一開始以為是腳本編碼的問題,但是檢查過後文字是以UTF-8編輯的。

詳細看一下錯誤訊息,是在執行SQL2時出現的錯誤,而字串SQL2中只有一個地方有中文字,而且只要把中文改成英文,腳本又正常了
SQL02=("select  to_char(start_time,'yyyy-mm-dd') as \"日期\",status " .....

所以可以確定是cx_Oracle的問題,於是更改搜尋的目標,找到了可能是NLS_LANG的問題。

我可以確定資料庫上是以AMERICAN_AMERICA.ZHT16BIG5來編碼,於python腳本中增加下列程式碼後又恢復正常了。
import os
os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.ZHT16BIG5'

上面主要是設定系統的環境變數NLS_LANG