As I Please

MTのいんすとーるの練習と、その他びぼうろく・・・

タグ「perl」が付けられているもの


メールがspamassasin (sa-spamd) を通っていない。

spamassasinは怪しいメールには、メール本文の冒頭に警告メッセージをつけてくれるので、スマートフォンなどのメール通知で怪しいメールが来たかどうかをすぐに見分けることができる。本当はすぐに隔離して mailboxに入らないようにすればいいんでしょうが。。。
ところが最近、別のサーバ(MX secondary)に届くメールにそれが入らなくなってしまった。どうも milterでsa-spamd を通らなくなってしまったようだ。
milter-manager ? spamd ? socketのowner,permission ? 何が悪いのかよくわからないまま、perlのライブラリ、ruby、openssl,gpgなどいろいろアップデートしてみたが、なかなか解決と行かなかった。


/var/log/spamd.log をつぶさに追っかけて、spamdがちゃんと起動していないのが原因のよう。
どうも sendmail をバージョンアップしたときからおかしくなってしまったよう。

error: Can't locate Net/SSLeay.pm in @INC
spamd: error: Bad arg length for Socket::unpack_sockaddr_in, length is 28, should be 16
あたりが問題だったようで、以下の記事を参照に、Socket6 を再インストールしたら解決した。
https://freebsd.sing.ne.jp/daily/09/09/05.html

ローカルの証明書の有効期限を通知2 (subjectの文字化け)

ローカルの証明書の有効期限を通知で仕込んでいたスクリプト/cronがちゃんと動いて60日前に証明書の期限切れを通知してくれた。が、Subjectが軽く文字化けしてた。 diffを見ると、
root@ns5:/usr/local/sbin # diff check_crt.pl check_crt.pl.20201026
26,27c22
< #$server_ssl = `/usr/bin/openssl x509 -enddate -in $ARGV[0] |/usr/bin/grep notAfter`;
< $server_ssl = `/usr/local/bin/openssl x509 -enddate -in $ARGV[0] |/usr/bin/grep notAfter`;
---
> $server_ssl = `/usr/bin/openssl x509 -enddate -in $ARGV[0] |/usr/bin/grep notAfter`;
81c76
< $subject_jis = encode("MIME-Header-ISO_2022_JP",$subject);
---
>
85c80
< Subject: $subject_jis
---
> Subject: $subject
106d100
< $subject_jis = encode("MIME-Header-ISO_2022_JP",$subject);
110,111c104
< Subject: $subject_jis
<
---
> Subject: $subject
127,131c120
< #$header_jis = encode("iso-2022-jp",$header);
< #
< # see https://tutorial.perlzemi.com/blog/20170424149304.html
< #
< #$header_jis = encode("MIME-Header-ISO_2022_JP",$header);
---
> $header_jis = encode("iso-2022-jp",$header);
139,140c128
< #$smtp->datasend($header_jis);
< $smtp->datasend($header);
---
> $smtp->datasend($header_jis);
のような変更を入れた。

bind の入れ替え>openssl の入れ替え > perl の入れ替え > perl moduleのインストールしなおし。

あぁ、依存関係が面倒だった。

bind-9.14.12 : portsで入れると
openssl : ports で。 1.1.1g に。
これで named はちゃんと動き始めたが、libcrypto.so が変わったのでちょっと心配になっていくつかみたら、
いきなり apache (mod_ssl.so)が共有ライブラリ見失った。
apache24 も作り直し。
ここで MTも見てみたら、ssl通信関連のモジュールが見当たらないとか言い始める。
501 Attempt to reload IO/Socket/SSL.pm aborted. Compilation failed in require (LWP::Protocol::https not installed):

もう片っ端から入れ直し。 perl5, p5-LWP-Protocol-https,p5-IO-Socket-SSL。でもこれでも直らないので、探してみたら
perl-Socketを入れ直すらしい。
https://qiita.com/fukuchan-senpai/items/e6d6731b27ead15e22e8

やっとこれで元に復帰した(つもりでいるけど、まだどっかに落とし穴があるに違いない)

bind の入れ替え>openssl の入れ替え > perl の入れ替え > perl moduleのインストールしなおし。

あぁ、依存関係が面倒だった。

bind-9.14.12 : portsで入れると
openssl : ports で。 1.1.1g に。
これで named はちゃんと動き始めたが、libcrypto.so が変わったのでちょっと心配になっていくつかみたら、
いきなり apache (mod_ssl.so)が共有ライブラリ見失った。
apache24 も作り直し。
ここで MTも見てみたら、ssl通信関連のモジュールが見当たらないとか言い始める。
501 Attempt to reload IO/Socket/SSL.pm aborted. Compilation failed in require (LWP::Protocol::https not installed):

もう片っ端から入れ直し。 perl5, p5-LWP-Protocol-https,p5-IO-Socket-SSL。でもこれでも直らないので、探してみたら
perl-Socketを入れ直すらしい。
https://qiita.com/fukuchan-senpai/items/e6d6731b27ead15e22e8

やっとこれで元に復帰した(つもりでいるけど、まだどっかに落とし穴があるに違いない)

pop2imap が certifcate でエラー

imaptoolsの代わりになるものを探すと、あっさりその名もpop2imap。今回の perlでモジュールをいくつか追加するだけでよさそう、と思ったらSSLサーバの認証が厳しくなってた。
普通に使うと、

From pop3 server [popserver] port [110] user [popuser]
To   imap server [imapserver] [ssl] port [993] user [imapuseruser]
TimeZone :[asia/tokyo]
Login POP OK
Unable to connect to imapserver: SSL connect attempt failed error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed  ...propagated at /usr/local/bin/pop2imap line 242.

と、今回は imap側のみSSLにしているが、エラーになる。
いろいろ検索してみると出てくるが、利用しているモジュール Mail::IMAPClient の中で呼ばれている IO::Socket::SSLでの証明書の取扱が厳格になったため、IMAPサーバで利用している勝手証明書(自己CA署名)の verifyが通らないからのようだ。https://metacpan.org/pod/IO::Socket::SSL#SSL_verify_modeにあるように、serverのときは SSL_VERIFY_NONE,clientとして使うときは SSL_VERIFY_PEERと、なり今回のように imap clientとして動作するときはその正当性を見るらしい。CAルートとして、SSL_ca_file,SSL_ca_path などで設定することもできたり、IO::Socket::SSLをインストールすると入る? Mozzila/CA/cacert.pm を見に行くようになっている。
勝手証明書を指定したり、正規の証明書を取得するのもありだけど、そこそこ面倒なので、単に IO::Socket::SSLを呼ぶときに SSL_VERIFY_NONE にしてしまうのが一番簡単かと。どうするべと思っていたら、
Mail::IMAPClientに、Socketargsという設定があって Mail::IMAPClientから IO::Socket::SSLを呼ぶときにパラメータ設定ができるようになっているのでこれを利用することにする。

*** /usr/local/bin/pop2imap     Thu Dec 27 21:49:13 2018
--- /usr/local/bin/pop2imap_noac        Wed Jan  9 19:53:45 2019
***************
*** 233,238 ****
--- 233,239 ----
                Uid      => 1,
                Debug    => $debugimap,
                Timeout  => $timeout2,
+               Socketargs => [ SSL_verify_mode => 0 ],
        ) ;
        if(!$starttls2) {
                $common{'Ssl'} = $ssl2;
とした、pop2imap_noacを利用。ただし versrion指定があって、
Version note: attribute added in Mail::IMAPClient 3.34
の模様。現在の時点では 3.40 。

pop2imap が certifcate でエラー

imaptoolsの代わりになるものを探すと、あっさりその名もpop2imap。今回の perlでモジュールをいくつか追加するだけでよさそう、と思ったらSSLサーバの認証が厳しくなってた。
普通に使うと、

From pop3 server [popserver] port [110] user [popuser]
To   imap server [imapserver] [ssl] port [993] user [imapuseruser]
TimeZone :[asia/tokyo]
Login POP OK
Unable to connect to imapserver: SSL connect attempt failed error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed  ...propagated at /usr/local/bin/pop2imap line 242.

と、今回は imap側のみSSLにしているが、エラーになる。
いろいろ検索してみると出てくるが、利用しているモジュール Mail::IMAPClient の中で呼ばれている IO::Socket::SSLでの証明書の取扱が厳格になったため、IMAPサーバで利用している勝手証明書(自己CA署名)の verifyが通らないからのようだ。https://metacpan.org/pod/IO::Socket::SSL#SSL_verify_modeにあるように、serverのときは SSL_VERIFY_NONE,clientとして使うときは SSL_VERIFY_PEERと、なり今回のように imap clientとして動作するときはその正当性を見るらしい。CAルートとして、SSL_ca_file,SSL_ca_path などで設定することもできたり、IO::Socket::SSLをインストールすると入る? Mozzila/CA/cacert.pm を見に行くようになっている。
勝手証明書を指定したり、正規の証明書を取得するのもありだけど、そこそこ面倒なので、単に IO::Socket::SSLを呼ぶときに SSL_VERIFY_NONE にしてしまうのが一番簡単かと。どうするべと思っていたら、
Mail::IMAPClientに、Socketargsという設定があって Mail::IMAPClientから IO::Socket::SSLを呼ぶときにパラメータ設定ができるようになっているのでこれを利用することにする。

*** /usr/local/bin/pop2imap     Thu Dec 27 21:49:13 2018
--- /usr/local/bin/pop2imap_noac        Wed Jan  9 19:53:45 2019
***************
*** 233,238 ****
--- 233,239 ----
                Uid      => 1,
                Debug    => $debugimap,
                Timeout  => $timeout2,
+               Socketargs => [ SSL_verify_mode => 0 ],
        ) ;
        if(!$starttls2) {
                $common{'Ssl'} = $ssl2;
とした、pop2imap_noacを利用。ただし versrion指定があって、
Version note: attribute added in Mail::IMAPClient 3.34
の模様。現在の時点では 3.40 。

iu-pop3toimapが新サーバで動かない

pop3しかサービスしていないサイトがあるので、別アカウントの imap4サーバにメールを移送するのに、imaptools の iu-pop3toimapを利用していた。
CentOS6で動かしていたものを いまどきなので centos7,ubuntuに移行しようと思ったらエラーが出て動かなくなった。

いろいろ調べたところ、perlのmoduleの IMAP::Utils が新しいと駄目、というオチのようだ。
上記github にある、lib/IMAP/Utils.pmを使えば暫定的には動くが、yum,aptでインストールする最新のものだと、なんか imap側の mboxの操作方法が変わってだめなようだ。

pop3toimap 1.3 starting
Connected to popserver on port 110
Connected to imapserver on port 993
Authenticating as you
Migrating from_name on popserver to to_name on imapserver (1 messages)
Unexpected response to  INBOX command: 1 BAD Error in IMAP command : Unknown command (4015741.935 + 0.000 secs).
1 unexpected APPEND response: >1 NO [TRYCREATE] Mailbox doesn't exist: *main::msg (0.001 + 0.000 secs).<
response is NULL
       Summary of POP3 -> IMAP migration
Users migrated  1
Total messages
Total bytes

imaptoolsも今となっては古いので新しいを探すことに。mtsatsenkoさん、長い間ありがとう。

iu-pop3toimapが新サーバで動かない

pop3しかサービスしていないサイトがあるので、別アカウントの imap4サーバにメールを移送するのに、imaptools の iu-pop3toimapを利用していた。
CentOS6で動かしていたものを いまどきなので centos7,ubuntuに移行しようと思ったらエラーが出て動かなくなった。

いろいろ調べたところ、perlのmoduleの IMAP::Utils が新しいと駄目、というオチのようだ。
上記github にある、lib/IMAP/Utils.pmを使えば暫定的には動くが、yum,aptでインストールする最新のものだと、なんか imap側の mboxの操作方法が変わってだめなようだ。

pop3toimap 1.3 starting
Connected to popserver on port 110
Connected to imapserver on port 993
Authenticating as you
Migrating from_name on popserver to to_name on imapserver (1 messages)
Unexpected response to  INBOX command: 1 BAD Error in IMAP command : Unknown command (4015741.935 + 0.000 secs).
1 unexpected APPEND response: >1 NO [TRYCREATE] Mailbox doesn't exist: *main::msg (0.001 + 0.000 secs).<
response is NULL
       Summary of POP3 -> IMAP migration
Users migrated  1
Total messages
Total bytes

imaptoolsも今となっては古いので新しいを探すことに。mtsatsenkoさん、長い間ありがとう。