SVX日記
2004-08-28(Sat) 単調作業嫌い党
まずは訂正から。昨日の日記でシリアルポートの規格は12Vだと書いたが、ある本に5Vから15Vと書いてあることに気づいた。つまり、Highは+5V〜+15v、Lowは-5V〜-15Vを出力するいうことであり、ウチのメビウスは全然許容範囲であった。また、入力は電圧が違い、Highは+3V以上、Lowは-3V以下でよいらしい。ちなみに手元にあるRS232Cのレベル変換ICであるSipexSP3232は5.5V出力、ADM232は9V出力とこちらもバラついている。まぁ、いわゆるレガシーの代表選手なので規格もわりあいアバウツなのかも。以上、失礼した。
で、昨日の環境構築作業も終わったので、今日はアナログメータの開発を再開。基本的にあとはPICのソフトの問題だけなので、秋月のPICプログラマキットでPICにプログラムを書き込んでは動作確認の繰り返しである。……が、ここでひとつ問題が。上記の作業を正確に書くと、以下のとおりなのである。
1) cygwinのviでソース修正
2) makeでアセンブル(似せZ80->PIC->HEX)
3) 秋月のライタをPCのシリアルポートに接続
4) PICをライタにセット、書き込み
5) テスト基板をPCのシリアルポートに接続
6) PICをテスト基板にセット、動作確認
7) 動かず、首をかしげる
8) 1)に戻る
ここで一番ストレスの溜まるのは7)なのは当然なのだが、3)と5)もかなりのストレスの元である。そうなのだ、ウチのPCにはシリアルポートが1個しかないので、シリアルポートを使う装置の開発を行う場合、プログラムの修正を試すたびに、毎度差し替えなければならないのである。ゲゲーリン・ウンザリノコフ。
まぁ、上でも書いたが最近のPCからはレガシー追放の動きがあり、シリアルポートがUSBポートに取って変わられつつある。特にノートPCではシリアルポートが付いているものはほとんどなくなってしまった。USBシリアル変換ケーブルというアイテムも売っているのだが、やはりブラブラするのは使い勝手が悪いしダサい。シリアルポートは自作の友であるから、ここはひとつノートPCでも省かないで頂きたいところだ。ちなみに私がサーバとして使用しているPC(このSVX日記を運用しているPCだ)はCUB-Xというマザーに1GHzのPenIIIを積んだマシンだが、なんとシリアルポートが2個ついているという素晴らしいマザーだ。このマザー、適当に選んだ割には大当たりであった。まるで、バブル期に開発されたSVXのような、お金のかかっている設計のマザーである。IDEなんぞムダに4ポートもあるからHDDが8台もつなげるほどだ。トラブル発生時のためにあと3枚はストックしておきたいほどのお気に入りである。
2016-08-28(Sun) ラズベリーパイ(pidora)で無線LANアクセスポイントする
先日「無線LANアクセスポイント自体をラズベリーパイで構築するのもいいかもしれん」などと書いたが、やってみることにした。
市販の無線LANルータをアクセスポイントモードに設定し、無線ブリッジとして振舞わせたいのだが、どーにも安定しないのだ。有線側からのブロードキャストが無線側に飛ばない。arpが飛ばなければ、接続できない。改めて購入したローエンドな無線LANルータも、結局はダメな感じだ。そりゃ、フツーの人は無線側の端末からWANと通信できるだけで十分なのかもしれないが、わしゃ宅内のホスト同士の通信が必須なんだ。
さて「ラズベリーパイ アクセスポイント」でググると大量のサイトが引っかかるのだが、どれもhostapdを使うことは共通しているものの、イマイチ内容がバラバラ。手順は書いてあるものの、その必要性がよくわからない。結局はhostapdに添付のドキュメントを読みつつ、試行錯誤が必要になった。
今回、構成したい無線LANアクセスポイントは、いわゆるルータモードではなく、ブリッジモードで動作させたいので、まずはブリッジインタフェイスを作る。前回と違うのは固定IPアドレスを割り振るところだ(別にDHCPでは絶対ダメということはないが)。
[root@xxxpi ~]# nmcli connection add type bridge ifname br0 stp no
[root@xxxpi network-scripts]# diff -bc x.ifcfg-bridge-br0.org ifcfg-bridge-br0
DEVICE=br0
STP=no
TYPE=Bridge
! BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
--- 1,10 ----
DEVICE=br0
STP=no
TYPE=Bridge
! BOOTPROTO=none
! IPADDR=172.xx.xx.xx
! NETMASK=255.255.255.0
! GATEWAY=172.xx.xx.xx
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
さて、ここから無線LANアクセスポイント化を開始する。上述したように、ラズベリーパイを無線LANアクセスポイント化する記事は多くあるのだが、よくわからないまま手順だけ書いてある記事が多いので混乱させられる。使用する無線LANアダプタなどに応じてアレンジを加える必要があるのだ。
今回、使用した無線LANアダプタは、IO DATAのWN-G300UAなのだが、重要なのは製品名よりも搭載している無線LANチップの種類だ。この製品はRealtekの8192CUという無線LANチップを搭載しており、これが同じならば、OS的には同じ機器であるとみなしていい。
[root@xxxpi ~]# lsmod
Module Size Used by
8192cu 540710 0
[root@xxxpi ~]# yum install hostapd
ここが混乱ポイント。hostapdには「ドライバ」という概念が存在し、搭載している無線LANチップの種類に応じて「/etc/hostapd/hostapd.conf」の中で適切に指定してやる必要があるのだが、ここでいう「ドライバ」とは、上記の8192cuドライバ(カーネルモジュール)とは完全に無関係であり、上記でインストールしたhostapdというパッケージに含まれる「/usr/sbin/hostapd」という実行ファイルに、予め組み込み済みのものなのだ。
そこでどうするかというと、Realtek社が個別に配布している、hostapdパッケージをコンパイルして、実行ファイルだけまるごと差し替えてやる。これにより、Realtekの8192CUという無線LANチップを搭載した無線LANアダプタで、無線LANアクセスポイントを構成することができる。なんだよ、そういうことなのかよ、そうならそうと言ってくれよ。
・Realtekのサイトから8192CU用のパッケージをダウンロード
http://www.realtek.com.tw/downloads/searchView.aspx?keyword=RTL8192CU
0001-RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip
・展開、コンパイル、差し替え
[root@xxxpi ~]# unzip 0001-RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip
[root@xxxpi ~]# cd RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/
[root@xxxpi wpa_supplicant_hostapd]# tar xvfz wpa_supplicant_hostapd-0.8_rtw_r7475.20130812.tar.gz
[root@xxxpi wpa_supplicant_hostapd]# cd wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/hostapd/
[root@xxxpi hostapd]# make
[root@xxxpi hostapd]# mv /usr/sbin/hostapd /usr/sbin/hostapd.org
[root@xxxpi hostapd]# mv /usr/sbin/hostapd_cli /usr/sbin/hostapd_cli.org
[root@xxxpi hostapd]# cp hostapd /usr/sbin/hostapd
[root@xxxpi hostapd]# cp hostapd_cli /usr/sbin/hostapd_cli
[root@xxxpi ~]# cd /etc/hostapd/
[root@xxxpi hostapd]# diff -bc hostapd.conf.org hostapd.conf
ignore_broadcast_ssid=0
# Uncomment these for base WPA & WPA2 support with a pre-shared key
! wpa=3
! wpa_key_mgmt=WPA-PSK
! wpa_pairwise=TKIP CCMP
! rsn_pairwise=TKIP CCMP
# DO NOT FORGET TO SET A WPA PASSPHRASE!!
! wpa_passphrase=YourPassPhrase
# Most modern wireless drivers in the kernel need driver=nl80211
! driver=rtl871xdrv
# Customize these for your local configuration...
! interface=wlan0
! hw_mode=g
! ieee80211n=1
! channel=N
! ssid=XXXXXXXX
! eap_server=1
! wpa_group_rekey=7200
hostapdを動作させる場合、wpa_supplicantが動作していると、処理が競合するっぽいので止めてやる。どうやら、単にサービスを止める設定をするだけでは、dbus経由で再起動がかかってしまうようなので、dbusの設定から殺しておく。
[root@xxxpi ~]# cd /usr/share/dbus-1/system-services/
[root@xxxpi system-services]# mv fi.w1.wpa_supplicant1.service x.fi.w1.wpa_supplicant1.service.org
[root@xxxpi system-services]# systemctl stop wpa_supplicant
[root@xxxpi ~]# cd /etc/modprobe.d/
[root@xxxpi modprobe.d]# vi 8192cu.conf
[root@xxxpi modprobe.d]# cat 8192cu.conf
options 8192cu rtw_power_mgnt=0
[root@xxxpi ~]# systemctl enable hostapd
[root@xxxpi ~]# systemctl start hostapd
[root@xxxpi ~]# systemctl status hostapd
なお、詳しい検証はしていないが、この直後にPSPやKOBOを接続しようとすると、認証が通らず、接続に失敗する現象が発生した。不思議なことに、PCから接続しようとすれば、接続に成功し、その後はPSPやKOBOも問題なく接続できるようになる。原因は不明。
[root@xxxpi ~]# journalctl -u hostapd.service -n 1000 | grep -C 1 pairwise
8月 28 14:54:54 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 RADIUS: starting accounting session xxxxxxxx-00000115
8月 28 14:54:54 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 WPA: pairwise key handshake completed (RSN)
8月 28 15:04:33 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 IEEE 802.11: deauthenticated due to local deauth request
--
8月 28 15:04:54 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 RADIUS: starting accounting session xxxxxxxx-00000116
8月 28 15:04:54 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 WPA: pairwise key handshake completed (RSN)
8月 28 15:14:33 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 IEEE 802.11: deauthenticated due to local deauth request
--
8月 28 15:14:55 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 RADIUS: starting accounting session xxxxxxxx-00000117
8月 28 15:14:55 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 WPA: pairwise key handshake completed (RSN)
8月 28 15:24:33 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 IEEE 802.11: deauthenticated due to local deauth request
--
8月 28 15:24:56 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 RADIUS: starting accounting session xxxxxxxx-00000118
8月 28 15:24:56 xxxpi.itline.jp hostapd[nnnnn]: wlan0: STA xx:xx:xx:xx:xx:61 WPA: pairwise key handshake completed (RSN)
2023-08-28(Mon) Rubyでデジタル署名付きメールを生成する
いまだどうも気分が晴れない日が続いている。が、何かに取り組んでいないと、ますます気分が沈むので、とりあえずさほど必要でもないようなプログラミングに取り組むのであった。先日に引き続き、自作のメーラであるMaveに電子署名(S/MIME)機能を搭載するのである。
まず、最初に必要なのが「メール署名用の証明書と秘密鍵」の生成だ。自分は「Easy-RSA」が好きなのだが「メール署名用証明書」の情報が見当たらない。まぁ、その用途は「サーバ証明書」よりもだいぶ少ないわけで、さらにそれを「オレオレ証明書」で済まそうというのだから、そら見当たらないわな。でも、できる。今回、最新版のEasy-RSAを使うために、素のFedora38のコンテナを上げて作業した。いやぁ、コンテナって本当にいいもんですね。方法はざっと以下だ。
・作業ディレクトリを準備する
# useradd t-yamada
# su - t-yamada
$ mkdir make_email_cert
$ cd make_email_cert
$ cp -a /usr/share/easy-rsa .
$ cd easy-rsa/3.1.5
・環境を初期化する
$ ./easyrsa init-pki
・新たに認証局を立てる(認証局証明書/秘密鍵を生成する)
$ ./easyrsa build-ca
Enter New CA Key Passphrase: ca_passphrase
Confirm New CA Key Passphrase: ca_passphrase
Common Name (eg: your user, host, or server name) [Easy-RSA CA]: OreOreSign
・認証局証明書/秘密鍵の内容を確認する
$ ./easyrsa show-ca
$ openssl x509 -in ./pki/ca.crt -text
$ openssl rsa -in ./pki/private/ca.key -text
Enter pass phrase for ./pki/private/ca.key: ca_passphrase
・メール用の証明書署名要求(秘密鍵)を生成する
$ ./easyrsa --dn-mode=org gen-req t-yamada ★ --dn-mode=org がキモ
Enter PEM pass phrase: yamada_key_passphrase
Verifying - Enter PEM pass phrase: yamada_key_passphrase
Country Name (2 letter code) [US]: JP
State or Province Name (full name) [California]: Tokyo
Locality Name (eg, city) [San Francisco]: Chiyoda
Organization Name (eg, company) [Copyleft Certificate Co]: Example Corp.
Organizational Unit Name (eg, section) [My Organizational Unit]: . ★ OU は略す
Common Name (eg: your user, host, or server name) [t-yamada]: Taro Yamada
Email Address [me@example.net]: t-yamada@example.com
Serial-number (eg, device serial-number) []:
・証明書署名要求(秘密鍵)の内容を確認する
$ ./easyrsa show-req t-yamada
$ openssl req -in ./pki/reqs/t-yamada.req -text
$ openssl rsa -in ./pki/private/t-yamada.key -text
Enter pass phrase for ./pki/private/t-yamada.key: yamada_key_passphrase
・認証局として証明書署名要求に署名する
$ ./easyrsa sign-req email t-yamada ★ email がキモ
subject=
countryName = JP
stateOrProvinceName = Tokyo
localityName = Chiyoda
organizationName = Example Corp.
commonName = Taro Yamada
emailAddress = t-yamada@example.com
Confirm request details: yes
Enter pass phrase for /home/t-yamada/make_email_cert/easy-rsa/3.1.5/pki/private/ca.key: ca_passphrase
・署名済みのメール用の証明書の内容を確認する
$ ./easyrsa show-cert t-yamada
$ openssl x509 -in ./pki/issued/t-yamada.crt -text
・PKCS#12(証明書と秘密鍵などをまとめた形式)に変換する
$ ./easyrsa export-p12 t-yamada
Enter pass phrase for /home/t-yamada/make_email_cert/easy-rsa/3.1.5/pki/private/t-yamada.key: yamada_key_passphrase
Enter Export Password: yamada_p12_passphrase
Verifying - Enter Export Password: yamada_p12_passphrase
・PKCS#12の内容を確認する
$ openssl x509 -in ./pki/private/t-yamada.p12 -text
Enter pass phrase for PKCS12 import pass phrase: yamada_p12_passphrase
$ openssl rsa -in ./pki/private/t-yamada.p12 -text
Enter pass phrase for PKCS12 import pass phrase: yamada_p12_passphrase
ひとつめに重要なのが「./easyrsa --dn-mode=org gen-req t-yamada」の「--dn-mode=org」。これを指定しないと、証明書内のSubjectにメールアドレスが入らず「メール署名用の証明書」にならない。もうひとつ重要なのが「./easyrsa sign-req email t-yamada」の「email」。これを指定しないと、証明書内の「Extended Key Usage」に「E-mail Protection」が入らず、やはり「メール署名用の証明書」にならない。
で、上記の作業の成果物が「pki/private/t-yamada.p12」だ。オレオレながら、認証局の署名済みの「メール署名用の証明書」である。普通にシステムの証明書ストアに置いたりしてメーラから使えるものだ。だが、今回はS/MIMEを自分で実装するのが目的だから、普通じゃないのである。以下のようなコードで扱うのである。
require 'openssl'
pkcs12 = OpenSSL::PKCS12.new(open('t-yamada.p12').read, 'yamada_p12_passphrase')
pkcs12.certificate.subject.to_a.each {|name|
puts("Subject: %s:\n\t%s" % name)
}
pkcs12.certificate.extensions.each {|ext|
puts("Extension: %s:\n\t%s" % [ext.oid, ext.value])
}
Subject: C:
JP
Subject: ST:
Tokyo
Subject: L:
Chiyoda
Subject: O:
Example Corp.
Subject: CN:
Taro Yamada
Subject: emailAddress:
t-yamada@example.com
Extension: basicConstraints:
CA:FALSE
Extension: extendedKeyUsage:
E-mail Protection
Extension: keyUsage:
Digital Signature, Non Repudiation, Key Encipherment
data = 'This is Mail text.'
pkcs7 = OpenSSL::PKCS7.sign(pkcs12.certificate, pkcs12.key, data, [], OpenSSL::PKCS7::DETACHED)
smime = OpenSSL::PKCS7.write_smime(pkcs7)
puts(smime)
MIME-Version: 1.0
Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg="sha-256"; boundary="----0123ABCD0123ABCD0123ABCD0123ABCD"
This is an S/MIME signed message
------0123ABCD0123ABCD0123ABCD0123ABCD
This is Mail text.
------0123ABCD0123ABCD0123ABCD0123ABCD
Content-Type: application/x-pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"
XXXXxxxxXXXXxxxxXXXXxxxxXXXXxxxxXXXXxxxxXXXXxxxxXXXXxxxxXXXXxxxx
xxxxXXXXxxxxXXXXxxxxXXXXxxxxXXXXxxxxXXXXxxxxXXXXxxxxXXXXxxxxXXXX
:
XXXXxxxxXXXXxxxxXXXXxxxxXXXXxxxxXXXXxxxxXXXXxxxxXXXXxxxxXXXXxxxx
xxxxXXXXxxxxXXXXxxxxXXXXxxxxXX==
------0123ABCD0123ABCD0123ABCD0123ABCD--
■ あるしぃー [初めまして、私も現在svx2台所有してます、タイトルに惹かれて、のぞきに来ました、仕事はスバルとポルシェに特化したレ..]