rollback
docker-build / Build image (push) Successful in 20s

This commit is contained in:
2026-07-31 11:42:35 +07:00
parent 2c2396e99e
commit 6ba0fbc176
3 changed files with 78 additions and 17 deletions
+27 -16
View File
@@ -1,14 +1,5 @@
import re
import sys
import urllib.request
def get_minio_public_key():
f = urllib.request.urlopen("https://subnet.min.io/downloads/license-pubkey.pem")
public_key = f.read()
if public_key[0:27] != b'-----BEGIN PUBLIC KEY-----\n':
raise ValueError("wrong public key prefix")
if public_key[-26:] != b'\n-----END PUBLIC KEY-----\n':
raise ValueError("wrong public key suffix")
return public_key[0:-1]
if len(sys.argv) < 4:
print(f"Usage: ./{sys.argv[0]} <original minio binary> <new minio binary> <new public key>")
@@ -21,17 +12,37 @@ new_public_key_path = sys.argv[3]
with open(original_minio_binary_path, "rb") as f:
minio_binary = f.read()
original_public_key = get_minio_public_key()
with open(new_public_key_path, "r") as f:
new_public_key = f.read().strip().encode("ascii")
if len(new_public_key) != len(original_public_key):
raise ValueError(f"wrong new public key length: {len(new_public_key)} != {len(original_public_key)}")
# AIStor встраивает НЕСКОЛЬКО публичных ключей лицензии (secp384r1, SPKI/PEM):
# один — legacy-ключ subnet.min.io, второй используется для валидации лицензии.
# Заменять надо ВСЕ ключи совпадающей длины, иначе проверка подписи идёт по
# незаменённому ключу и падает с "could not verify message using any of the keys".
pem_re = re.compile(rb"-----BEGIN PUBLIC KEY-----\n.*?\n-----END PUBLIC KEY-----", re.DOTALL)
new_minio_binary = minio_binary.replace(original_public_key, new_public_key)
embedded_keys = pem_re.findall(minio_binary)
if not embedded_keys:
raise ValueError("no embedded PUBLIC KEY blocks found in binary")
new_minio_binary = minio_binary
replaced = 0
for key in set(embedded_keys):
# длина нового ключа обязана побайтово совпадать со встроенным, иначе поедут
# смещения в бинарнике; ключи другой длины/типа пропускаем.
if len(key) != len(new_public_key):
continue
new_minio_binary = new_minio_binary.replace(key, new_public_key)
replaced += 1
if replaced == 0:
raise ValueError(
f"no public key of matching length ({len(new_public_key)}) found to replace"
)
if new_minio_binary == minio_binary:
raise ValueError(f"could not replace old public key")
raise ValueError("could not replace old public key(s)")
print(f"replaced {replaced} embedded public key(s)")
with open(new_minio_binary_path, "wb") as f:
f.write(new_minio_binary)