我的(唯一)数据库服务器宕机了,我正在恢复所有内容。我创建了一个新服务器,现在我只想恢复数据库备份。
我有一个夜间脚本,运行以下命令来创建加密备份:
pg_dump $DATABASE | openssl smime -encrypt -binary -text -aes256 -out $HOME/$DUMP_FILE_NAME -outform DER ~/sql_dump.pub.pem
现在我有了生成的文件,因此我运行以下命令:
openssl smime -decrypt -in database.enc -recip sql_dump.priv.pem
我的 sql_dump.priv.pem 文件如下所示:
-----BEGIN PRIVATE KEY-----
(private key data)
-----END PRIVATE KEY-----
但是由于某种原因,我收到此错误而不是解密文件:
unable to load certificate
139830333706752:error:0909006C:PEM routines:get_name:no start line:crypto/pem/pem_lib.c:745:Expecting: TRUSTED CERTIFICATE
我不确定发生了什么或为什么,但我知道我在开发备份解决方案时曾多次成功解密加密。所以我知道有办法解密它。
有人知道出了什么问题吗?
PS 我知道...我应该有多个数据库服务器来防止这种情况。以及自动备份脚本或至少记录如何从此类情况中恢复。我没有这样做,我应该这样做 :( 下次吸取教训
我在服务器和开发笔记本电脑上都使用 Linux,以防万一
编辑:
好的,我现在更近了一步。
我正在解密:
openssl smime -decrypt -in database.enc -recip sql_dump.pub.pem -inkey sql_dump.priv.pem
但我现在收到另一个错误:
Error reading S/MIME message
140276418503168:error:0D0D40D1:asn1 encoding routines:SMIME_read_ASN1:no content type:crypto/asn1/asn_mime.c:391:
答案1
好吧,经过一番努力后我终于明白自己做错了什么。
首先,该-recip
标志代表公钥,因此我将该标志改为指向我的公钥。
要包含私钥,需要该-inkey
标志。所以我也添加了它。
最后,-outform
备份脚本中的标志必须与-inform
恢复脚本中的标志相匹配。因此,最终的解密命令如下:
openssl smime -decrypt -inform DER -in database.enc -recip sql_dump.pub.pem -inkey sql_dump.priv.pem
然后一切就绪了,现在网站已恢复运行:)
TODO:实际上,把这一切都写下来,这样如果再发生灾难,我就不会再经历这一切了!!!