2021-05-20

tomcat 版本slowlirs dos攻擊修改

 很簡單,Connector加上connectionTimeout="8000" (不要大於8秒,不然會失敗) 即可,

測試工具:

https://github.com/shekyan/slowhttptest/wiki


ref

https://stackoverflow.com/questions/49442855/mitigating-slow-http-post-vulnerability-on-tomcat-8

2021-05-19

apache + php 連線過多卡住

 apache + php 連線過多卡住,若是資料庫問題,可考慮使用proxysql,畢竟php沒有sql thread pool,就算是用 pconnect() 設定上也是很麻煩,也且一個連線也只能給同一個process的thread共用,只能說是半套,那不如直接用connect()連完就drop即可。

若不是資料庫而是apache撐不住,可以調整 prefork模組的設定(可用apachectl -V或httpd -V查看是不是prefork模式),

譬如 apache 2.4的/etc/apache2/mods-available/mpm_prefork.conf:

<IfModule mpm_prefork_module>

        StartServers            4

        MinSpareServers         15

        MaxSpareServers         75

        ServerLimit             3000

        MaxRequestWorkers       3000

        MaxConnectionsPerChild  9000

</IfModule>

或apacpe 2.0 的 /etc/httpd/conf/httpd.conf

<IfModule prefork.c>

StartServers       8

MinSpareServers    15

MaxSpareServers   75

ServerLimit      3000

MaxClients       3000

MaxRequestsPerChild  9000

</IfModule>


2021-05-17

itext產生LTV(Long-Term Validation)重點-還有自然人憑證的雷

 1. PDF簽章類型使用CMS可以直接在signature內含CRL/OCSP資訊達成LTV,CADES(PAdES B-T (basic - timestamped))簽章類型則必需附加DSS(Document Secure Store)在檔案尾端(這樣用adobe reader打開會變成有「檔案已修改但被原作者承認的資訊」,但實際上itext好像不在乎你用哪個?),標準上只要包含憑證鏈所有憑證(除了CA不用)的CRL或OCSP其中之一的資訊即可達成LTV, 實作上則要先注意有的憑證內缺少OCSP URL(譬如行政院MOICA憑證...有夠雷,itext也不會提示你到底有沒有正確ocsp response,無奈)

注意,達成LTV, tsa(timestamp server)的憑證或CRL/OCSP資訊是不需要的,不用加入

2.注意憑證extension的Authority Information Access(AIA)包含的上一層issuer ca網址,格式可能是#PKCS7(.p7b)憑證(如自然人憑證的.p7b包含了一代及二代的憑證),有的套件(如pdfbox)預設會當成X509單一憑證,因此解不出來...(這也很雷)

2.時間tsa server的憑證及CRL/OCSP則無關緊要,無須包含其CRL/OCSP

3.Adobe Reader要把tsa server加到時戳伺服器信任清單,簽章的issuer及tsa的二個CA也要加到Adobe Reader的信任憑證(除非本來就在AATL或EUTL信任清單)

4.如果是包含CRL,要注意檔案有時會變得很大!而有時CRL太大抓不下來,可利用像itext的CrlClientOffline() 類別把預先抓下來的CRL載入即可。

5.檢查憑證鏈(除了根憑證)的每個憑證extension是否有包含CRL或OCSP的URL資訊,所有憑證至要有CRL或OCSP其中一個,有的憑證是同時缺少二者的,這樣無法達成LTV(這表示憑證有問題,若是CA憑證本來就不用這二個),而像MOICA就沒有OSCP只有CRL,因此個人憑證可用OCSP,但MOICA憑證只能用CRL達成LTV

5.目前試用自然人憑證做PDF數位簽章,上面1,2點的雷都有,政府(花錢叫中華)做的東西就是他X的雷。使用證券商的憑證就比較沒這些問題,一次達成LTV。

6.如果你到戶政辦自然人憑證,那麼卡片雖然會寫入個人的"二代"憑證,但用程式(如java)去取出cer1或cer2憑證鏈時,可能中繼(MOICA)及根(GRCA)都還是一代憑證!!可能為了省事只寫入個人憑證,然後舊的庫存卡片都預設先存好一代中繼及根憑證,這真的非常之雷,所以我怎麼用程式自動OCSP取得廢止狀態就是他馬的驗證不會過...後來發現這問題,就到自然人憑證網站重新寫入過一次憑證就都換成二代的了(譬如用修改email功能就會三個憑證都重寫),真的是超雷。

7.第三方套件的itext作者初始簽章LTV有點bug,我已經修改發了個PR上去了:
https://github.com/itext/itext7/pull/72


ref:
https://community.adobe.com/t5/acrobat-reader/ltv-enabled-signatures-not-longer-ltv-enabled-after-update-to-adobe-dc-2018/m-p/9898669

https://stackoverflow.com/questions/46321086/how-to-sign-a-pdf-with-embedded-timestamp-and-ltv-enabled

https://helpx.adobe.com/tw/acrobat/kb/certificates-corrupted-after-updating-trust-store.html

2021-05-12

netbeans 8 修復maven 及 plugin 問題

 新的maven要求https傳輸,所以需要升級maven:

1.下載新的maven:

http://maven.apache.org/download.cgi

2.解壓縮下載的檔案,放到netbeans安裝資料夾中的 java/maven 資料夾

3.在netbeans的jave/maven設定中,替換掉maven home

4.把 maven的conf/settings.xml的mirror區塊註解掉


然後netbeans 8的plugin portal的url發現已失效,可到以下頁面去找:
https://cwiki.apache.org/confluence/display/NETBEANS/Where+to+download+plugins+for+NetBeans+10.0+and+earlier

例如8.2: http://plugins.archive.librebeans.org/catalogue/8.2/catalog.xml

ref:

https://stackoverflow.com/questions/14026314/maven-location-when-installed-indirectly-with-netbeans-glassfish

https://oak.dev/2020/03/03/maven-error-return-code-is-501-reasonphrase-https-required/

2021-05-05

升級JDK 11.0.11後,無法正常使用TLS寄信

 ubuntu上面利用javax.mail寫的寄信程式,在系統自動升級jdk到 11.0.11 後,使用tls smtp寄信就失效了,經查是因為 jdk已禁用了 tls 1.0, tls 1.1,所以必須改強制使用 tls >= v1.2(很奇怪的點就是javax.mail握手時不會自動tls v1.2 or 1.3) ,當然你的mail server也要有支援 tls >= v1.2


            props.setProperty("mail.smtp.host", "your.smtp.server");

            props.setProperty("mail.smtp.auth", "true");

            props.setProperty("mail.smtp.port", "587");

            props.setProperty("mail.smtp.starttls.enable", "true");

            props.setProperty("mail.smtp.ssl.protocols", "TLSv1.2"); //強制tls v1.2

            Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {

                @Override

                protected PasswordAuthentication getPasswordAuthentication() {

                    return new PasswordAuthentication("username", "password");

              }

            });