iPhoneのアップデートに失敗、復元もできなくなる

家で仕事をしていて暇なのでiPhoneのアップデートをした。普段はだいたい家のWifi経由でやっているのだが、CDをiTunesライブラリに追加してそれと同期させるために久しぶりにiTuneにつないだらアップデートがあると表示されたのでついでにやっておこうと思った。

ダウンロードに結構時間がかかっていて、別のことをして放っておいた。しばらくたってアップデートが始まり、iPhoneの画面が黒い背景に白いリンゴと進行を示す白い横線になった。

が、横線が数ミリくらい進んだ状態で止まってしまった。

どれくらいの時間がたったかは定かではないが20分くらい止まったままだったと思う。

どう見ても進んでいないので強制的に電源を落としリカバリモードで起動しアップデートを再実行しようとしたができない。仕方がないので「復元」を選ぶがそれもできない。

何度か試してダメなので、とりあえずもう一台あるiPhoneにSIMを差し替えた。apple idを変えたりlineやpaypayが入ってないので入れたりいろいろやって1時間くらいかかる。とりあえず「ケータイがなくて困る」という事態はなんとかなった。

アップデートに失敗したiPhoneも、そう簡単に壊れないだろうと再度復元を試みる。調べると、MS StoreからダウンロードしたiTunesで失敗することがあるという情報があった。appleサイトからダウンロードしたものを使えばうまくいく、とある。

appleのサイトにもMS Storeのリンクがあるが、「ほかのバージョンをお探しですか?」のリンクからstore経由でなくダウンロードできる。(本当に違うものなのか確かめていないが)

iTunesを入れなおすと、失敗していた復元が進むようになった。

が、途中で失敗する。

lightningケーブルを変えたり、接続するUSBポートを変えたりいろいろやるがどうしてもうまくいかない。

appleに問い合わせると、appleデバイスというソフトがあるのでそれでやってみてというのでやってみたがiTunesと同じような状態。

「別のPCにつないでなおった」「macにつないでなおった」などの情報があったので別のノートPCにiTunesやappleデバイスを入れてやってみるが、同じ。

Lightningケーブルを変えると、止まる場所が多少変わったりするが、途中で失敗するのは同じ。

失敗したときに表示されたメッセージで検索してみるが、参考になる解決方法は見つからない。サポートに伝えてもそのメッセージはアップルが公開していない、と言う。


iPhoneはリセットすると通常通り起動せず、「リカバリモード」と呼ばれるらしい、黒い背景にライトニングケーブルとノートPCの絵が描かれた画面が表示されて止まる。

機種は13 miniで、iOS 18.1 にしようとして失敗した。上げる前のバージョンがなんだったか覚えていないが、18系だったはず。

リカバリモードでPCにつなぐとiTunesで認識され、「アップデートまたは復元してください、アップデートならデータは残るが復元だと初期化される」というようなメッセージが表示され、アップデートしてみるとすぐ失敗し、復元してみると更新が始まるがリンゴマークが表示され下に進行度を示す白い線が出るが止まる。


表示されたメッセージは以下のようなもの。

iPhone "iPhone"をアップデートできませんでした。不明なエラーが発生しました(75)。067E.004B

iPhone "iPhone"を復元できませんでした。不明なエラーが発生しました(1109)。0634.0000

iPhone "iPhone"を復元できませんでした。不明なエラーが発生しました(53)。


一番惜しいパターンは、appleデバイスを使って、純正ケーブルでつないで復元したときで、
進捗の線がちょうど真ん中あたりで止まり、appleデバイス側のメッセージが「更新しています」から「確認しています」みたいなメッセージに変わってしばらくたって、53のエラーになる。

これを見ていると復元自体はしているがなんらかのチェックがうまくいかず正常終了とみなされない、みたいな感じに見える。まだ新しいし、濡らしたことはないし落としたことはあることはあるがケースをつけていてそんなに激しい衝撃を与えたことはない。ハードウェア的に破損しているようには思えない。

appleサポートにappleデバイスでやってもダメでメッセージ内容を伝えると店舗に持ち込んで見てもらうように言われる。

予約状況を見るとすぐにはできず、送る場合はさらに日数がかかる。そんな重症とは思えず、ちょっとしたことで治りそうだと思うので、appleではない一般の修理店を探してみる。ここならなおしてもらえそうかなという店があって、費用は1.5万くらい。電話してみると治るかどうかはやってみないとわからないし、費用ももっとかかる場合もある、という。ただ、その日の夜に持ち込めるということなのでとりあえず予約した。

その後も復元にトライし続け、調べていくうちにDFUモードというものがあることを知る。リカバリモードと似ているが、appleが公式には公開していないモードらしく、とにかく強制的にファームウェアを書き換えるようなモードらしい。

DFUモードへの切り替え方を説明している人は何人かいて、タイミングが少し微妙なのだが何度か入ることができ、試したが通常の復元とほとんど変わらない状況だった。

最後に、「修復ソフト」の使用を検討した。この問題について調べているときに、ずっと修復ソフトの情報が出てきてはいたが、どうも怪しく、信用できないので避けていたのだが万策尽きたので試してみることにした。

まず、広告しか出てこないものは避ける。一般のユーザーがレビューしたりブログや信用できるサイトで紹介しているようなものを探し、なかなかなかったが比較的信用できそうだったのが iMyFone Fixppo である。

一応無料で使用できるとなっているが、他のソフトも同様なのだが、無料で実施できることはごくわずかで、それで修復することはできなかった。

仕方なく5000円弱の料金を払って、名前は忘れたがアドバンストモードだかなんだかを実施すると、「Apple Mobile Device Serviceのドライバが壊れている」みたいなメッセージが表示されてそのドライバを修復するような動作がおこなわれた後、復元できるようになった。

ということはiPhone本体ではなく、PC側(ソフト)の問題だったということか。

とりあえず治ったのでよいが、PC側の問題が違うPCでも起きていたとすると、もはやそれは破損とか故障とかではなくて「不具合」ではないだろうか?

もしかしたら下記とかをやっていれば治っていたのかもしれない。

あるいは、Macにつないだら治っていたとか。MacはUSB-Cしかインターフェースがなく、iPhoneをつなげられなかったので試せなかったのだが。

ショップの予約はキャンセルした。

さくらのVPSのパケットフィルタ

さくらのVPSでsquidを設定してあったので、使ってみようと思ったのだが、使えない。

クライアントで プロキシ設定してもサーバに到達しない。firewalldやssやtcpdumpやnmapで確認する限り、どう考えてもサーバの前で止まっている。

ssで表示される、listenしているポートはすべて利用可能でsquidだけが通らない。

さくらインターネットが止めてるんじゃないか?サポートに問い合わせてみようか、と思って思い出した。さくらインターネットがパケットフィルタを提供していることを。

以前、こんなのfirewalldでやるからいらない、と無効にしたと思っていたのだが、見たら動いていて、自分が使っているポートが許可されていてsquidだけが空いてなかった。

 

fail2ban

以前から気にはなっていたのだが、メールサーバに大量の不正アクセス(ブルートフォースアタック)がある。アドレスはまちまちでアカウント名をテキトーに変えてアクセスしてくる。ログインに成功したり不正なメールリレーしてしまったことは多分ないと思うし、特にサーバに負荷がかかっているとかいういこともないので放っておいたのだが、fail2banを使ってみた。

/etc/fail2ban/jail.conf にいろんなサービスの定義が書いてある。

jail.localというファイルを作って、監視したいサービスだけを書くと、その部分だけ設定を上書きしてくれる。
私は以下のようにした。(centos)

[DEFAULT]
ignoreip = xxx.xxx.xxx.xxx/32
bantime  = 1w
findtime  = 1h
maxretry = 3
backend = auto

filter = %(__name__)s

#
# ACTIONS
#
destemail = hoge@example.com
banaction = firewallcmd-ipset
banaction_allports = firewallcmd-allports
action = %(action_mwl)s
#
# JAILS
#
#
# SSH servers
#
[sshd]
enabled = true

[postfix-sasl]
enabled = true

[cyrus-imap]
enabled = true

[postfix]
enabled = true

ignoreipは、監視対象外とするIPアドレス
1時間以内に3回の不正アクセスがあると1週間バンする。

バンアクションのところは、ubuntuだったらufw、とかに書き換える。

バンが発生するとログが記録されるが、destemailに書いたアドレス宛にメールが送信される。
action_mwl というのは、アドレスと、whois情報と、ログ情報がメールに記載される。

私はwhoisをインストールしておらず、メールに「whoisがない」と書いてあったのでインストールしたらwhois情報が載るようになった。

postfix + dovecot (TLS有効)のメールクライアント設定

メールサーバのfqdnが mail.example.com
ユーザー名が taro
メールアドレスが taro@example.com
とする
サーバにtaroというユーザがあること
(Maildirが必要?調べればすぐわかるはず)

thunderbird

サーバ設定
 サーバの種類:IMAPメールサーバー
 サーバー名:mail.example.com
 ポート:993
 ユーザー名:taro

セキュリティ設定
 接続の保護:SSL/TLS
 認証方式:通常のパスワード認証
 送信(SMTP)サーバー
 サーバー名:mail.example.com
 ポート番号:465

セキュリティと認証
 接続の保護:SSL/TLS
 認証方式:通常のパスワード認証
 ユーザー名:taro
 
Thunderbirdの設定
 プライバシーとセキュリティ→証明書→証明書を管理→インポートをクリックして
 CA証明書をインポートする
 ※windowsにインストールしてもダメみたい


iPhone(英語)

Settings > Apps > Mail > Mail Accounts > Add Account > other > Add Mail Account 
 Name: (表示名)
 Email: taro@example.com
 Description: (説明)

INCOMING MAIL SERVER
 Host Name: mail.example.com
 User Name: taro
 Password: (パスワード)

OUTGOING MAIL SERVER > SMTP > mail.example.com
 PRIMARY SERVER: mail.example.com   が On
 > Server が有効
 Host Name: mail.example.com
 User Name: taro
 Password: (パスワード)
 Use SSLが有効
 Authentication: Password
 Server Port: 587

Advanced > INCOMING SETTINGS
 Use SSLが有効
 Authentication: Password
 IMAP Path Prefix /
 Server Port: 993

あれ、thunderbirdとiphoneでSMTPのポート番号が違うな?
どっちでもいいのか?

証明書について
postfixとdovecotでそれぞれサーバー証明書とサーバーの秘密鍵が必要。
同じものを使う。
サーバー証明書はCA証明書とチェーンになったものを使用する。
CA証明書はクライアントにインポートし、信頼する


その他
以前、DKIMとかSPFを設定したが、とくになくてもgmailとかに送れる。
(gmailと自分のサーバしか試してないが)

dovecotでsslv3エラーが出るときの証明書

postfix & dovecotでSSL化していたメールサーバーの証明書の期限が切れていたため、更新したのだが下記のエラーが表示される。

2024-11-07T04:35:55.635061+09:00 jesus dovecot: imap-login: Disconnected: Connection closed: SSL_accept() failed: error:0A000412:SSL routines::sslv3 alert bad certificate: SSL alert number 42 (no auth attempts in 0 secs): user=<>, rip=xxx.xxx.xx.xxx, lip=xxx.xxx.xxx.xxx, TLS handshaking: SSL_accept() 


以前は送受信できていて変えたのは証明書だけだから証明書の問題かなと思い、何度も証明書を作り直したのだがなおらない。

ログをみると sslv3 と書いてあるが、sslv3はもう使用されない、使用すべきでない古いプロトコルである。

postfix&dovecot でプロトコルバージョンの設定をしたが変わらない。

ログの内容でググると、「証明書が中間証明書を含んだチェーンんになっていない」という情報が出てくるのだが、チェーン証明書など使わないでも以前は送受信できていたので関係ないと思っていた。

DovecotのSSLエラー - GentooやIoTの覚え書きブログ

しかしどうしてもなおらないので、下記を参考にチェーン証明書を作って置き換えてみたらうまくいった....

OpenSSLでチェーン証明書を作成する方法 #OpenSSL - Qiita

しかしなんでチェーン証明書でないとsslv3のエラーになるのか... 納得いかない...

チェーン証明書の作り方なんて知らなかったから、間違いなく以前は普通のサーバー証明書で動いていたはず。


ちなみに証明書はopensslを使って作った自己CA(?)で署名したヤツである。


CA構築 2024

ubuntu 
サーバはj***、digital oceanのvps
Ubuntu

opensslのconfigは /etc/ssl/openssl.cnf

/etc/pki/CA に移動する。
ここで全部やる。

openssl.cnfを /etc/pki/CAにコピーする。

openssl.cnfを編集

[ CA_default ]
dir             = .            # Where everything is kept
private_key     = $dir/cakey.pem # The private key

[ req_distinguished_name ]
国とかcityとかのデフォルト値を入れておく


v3_ca
というファイルを作って下記を記載し、署名時に使う
(opnessl.cnfの[v3_ca]セクションに書いたら行けると思ったがだめだったので)
 
basicConstraints = critical, CA:true
keyUsage = critical, cRLSign, keyCertSign
subjectKeyIdentifier=hash


#これをやっておく

touch index.txt
echo 00 > serial

#ca証明書のcsr発行

 openssl req -new -key ./cakey.pem -out ./ca.csr

※openssl.cnfにkeyの場所を書いたつもりだが効かないので指定した
なぜ効かないとわかったかというとパスワードを聞かれたから


#CA証明書のCSRにサイン

openssl ca -in ca.csr -selfsign \
-notext -config openssl.cnf -outdir . \
-extfile v3_ca -out cacert.pem\
-startdate 241101000000Z -enddate 251031235959Z

いつもつけていなかったが、-notextを指定すると読める情報が書かれない(あっても問題ない)

-extfile v3_ca がさっきのCA情報

これもいつもやらないが、-startdate -enddateを明示的に指定。
指定しないと作った時間になって切りが悪いのでこっちの方がいい。

openssl x509 -in cacert.pem -text

中身を確認

 Version: 3 であること

下記があること

 X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Key Usage: critical
                Certificate Sign, CRL Sign

※この後別のcentos9のサーバでCA証明書を作ったが上記オプションがなくても問題なく使えた。

#iPhoneにCA証明書をインストール

証明書をテキストにコピーし、拡張子.crt (.pemでもいいはず)にして
メールでiPhoneに送る。

証明書をiPhoneにダウンロードして開き、インストールする。
(私はapple watchを使っているので、iphoneとapplewatchのどちらにインストールするかと聞かれた)

※私はiPhoneの言語を英語に設定している

すると、Settings > General > VPN & Device Management の、
DOWNLOADED PROFILE に表示されるのでタップして開くと、Not Verified と表示されている。
中身を見て、「Certificate Authority」がYesになっていること
Versionが3であること
を確認

最初に戻って、右上のInstallをタップ

ここで終わりではない。

General > About > Certificate Trust Settings > ENABLE FULL TRUST FOR ROOT CETIFICATES
で、インストールした証明書を信頼する。


Raspberry Pi zeroのライブカメラの首振り

pi zeroにカメラをつけてケースに収めたものにサーボモーター(SG92R)をくっつけて、本体ごと回転させてカメラを首振りさせてみた。

pythonのソース

#!/usr/bin/python
import pigpio
import time
gpio_pwm = 18
pig = pigpio.pi()
pig.set_mode(gpio_pwm, pigpio.OUTPUT)

para_max = 110000
para_min = 70000
para = para_min
interval=20
delta=10000

try:
  while True:
    if para >= para_max:
        flag=-1
    elif para <= para_min:
        flag=1
    para = para + (delta*flag)
    pig.hardware_PWM(gpio_pwm, 50, para)
    time.sleep(interval)
except KeyboardInterrupt:
  pig.set_mode(gpio_pwm, pigpio.INPUT)
  pig.stop()



Piとの接続は、SG924Rの茶→GND、赤→5V、オレンジ→GPIO18

これを実行するためには pi gpio daemonが起動している必要がある。

sudo pigpiod

そして、motionをバックグラウンドで動かしておく。

libcamerify motion -b


このやり方はPWM制御といってduty比というものを指定する。

hardware_PWM に3つの引数を渡しているが順にGPIOのピン番号(今回は18を使用)、動作周波数(50Hz)、duty比である。

動作周波数はモータによるようだ。SG92RのデータシートがみつからないのだがSG90Rはあって、そこに50Hzと書いてあった。

duty比が大きいと大きく回転することはわかったがどこが基準でどれだけ大きくするとどれだけ回転するのかがいまいちよくわからない。

誰かのソースを動かしてみて、値を変えながら確認していった。

モーターをpi zeroのケースの下にくっつけたのだがその時の角度はテキトーである。

duty比は70000~110000の範囲で変えると、正確に測っていないが大体120度くらいの範囲で首振りできた。

初期値を70000にして、大きくしていくと半時計周りに回転する。そして11000を超えたら、こんどは小さくしていくと時計回りに回転する。70000を下回ったらまた大きくする。これを繰り返して「首振り」動作が実現できた。

モータを回してsleepする時間と、duty比の変化量を変えることでゆっくり首振りしたり、なめらかにさせたり、ガクンガクンと大幅に首振りさせることができる。


電源ケーブルやgpioと接続しているケーブルが邪魔にならないように余裕をもたせてたるみをもたせつつ固定しておく。ある程度重みのある台となるものにモーターを固定しpi zeroのケースをつけた。

仮なので両面テープやビニールテープを使っている。




びんぼうでいいの nano

よくみるyoutuberが、電子工作ではarduino nanoを使う、UNOは使わない、と言っていた。

私はUNOやraspberry piを使っていたがnanoは持っていない。raspberry pi picoは最近買った。

じゃあarduino nanoを買っておこうかと思ったが、arduinoはびんぼうでいいので問題なく動くので、nanoも互換機でいいだろうと思った。

aitendoで NN328CH340A という名前で600円で売っている。ピンヘッダが付属しているがはんだ付けが必要。「びんぼうでいいの」とは書いていない。

秋月電子でピンヘッダ実装済みのものは3560円だ。


ピンヘッダをはんだ付けして使ってみる。USB-Cケーブルを挿すと L というLEDがチカチカ点滅する。「故障か?半田ミスか?」と思ったが、デフォルトで本体のLEDを点滅させるスケッチが有効になっているとのことだった。

自分でスケッチを書いて外付けのLED+抵抗につなぐと動いた。



----------------------
void setup()
{
  pinMode(2, OUTPUT);
}

void loop()
{
   digitalWrite(2, HIGH);
   delay(1000);
   digitalWrite(2, LOW);
   delay(1000);
}
-----------------------

本体のLEDがまぶしいのでビニールテープを貼って隠した。

Raspberry Pi Zero 2 WH で カメラモジュールv3

スイッチサイエンスで本体とカメラ(広角)とケースとカメラ用ケーブル(zero用短め)を買った。

普通のカメラでよかったのだが売り切れていて広角しかなかった。


OSは、imagerでrecommendされた 64-bitのデスクトップこみのBookwormである。

imagerでOSをインストールするときにwifiとsshを有効にしておく。

起動したらdhcpサーバーで割り当てられたIPアドレスを確認しsshする。

raspberry piでのdhcpのIPアドレス固定設定はもう dhcpcd.confでやらなくなったようだ。

面倒くさいのでdhcpサーバの方でアドレスを固定した。


いったんshutdownしてカメラをつないで起動し、apt update/upgradeして再起動した。

libcamera-hello を実行する。sshなのでプレビュー画面は表示されないがカメラは認識されている。

motionをインストールする。

いつもの設定をして

libcamerify motionを実行

pi5のときと同じエラーになったので

同じように

apt install libcamera-v4l2

を実行すると、motionが動いた。

IPA moduleのエラーが出るのも同じだが無視。


zeroだから非力かなと思ったが、2048x1536でも大丈夫だった。