Skip to content

Instantly share code, notes, and snippets.

@rhenium
Created August 22, 2023 09:48
Show Gist options
  • Save rhenium/5e69db3780288fa2abbfd4319579372f to your computer and use it in GitHub Desktop.
Save rhenium/5e69db3780288fa2abbfd4319579372f to your computer and use it in GitHub Desktop.
むかしの tweetdeck.twitter.com がつかいたい

むかしの tweetdeck.twitter.com がつかいたい

旧 TweetDeck の JS バンドルは ton.twimg.com に残っている。どうやら API リクエストも通るらしい。 なら https://tweetdeck.twitter.com/ の HTML さえ用意してやればもとどおり?

だけど、

  • API リクエストは api.twitter.com に向いている。 CORS のため、オリジンは https://tweetdeck.twitter.com/ でなくてはならない。

  • twitter.com は HSTS が有効だから self-signed 証明書の警告を無視できない。 CA 証明書を別途作ってブラウザーに事前に登録してやる必要がある。


手順↓

  1. 証明書を用意する。ca_cert.pem, ca_key.pem, cert.pem, key.pem のよっつのファイルがつくられる。
ruby gencerts.rb
  1. ブラウザーの設定で、ca_cert.pem をルート証明書としてインストールする。

  2. TweetDeck の HTML を拾ってくる。これは Internet Archive の Wayback Machine から持ってこられる。

curl --compressed http://web.archive.org/web/20230104013608id_/https://tweetdeck.twitter.com/ >index.html
  1. HTTPS サーバーを立ち上げる。
ruby serv.rb
  1. tweetdeck.twitter.com を 127.0.0.1 に向ける。
echo '127.0.0.1 tweetdeck.twitter.com' | sudo tee -a /etc/hosts
require "openssl"
def setup_ca
key = OpenSSL::PKey::EC.generate("prime256v1")
cert = OpenSSL::X509::Certificate.new
cert.version = 2
cert.serial = 12345
cert.subject = OpenSSL::X509::Name.parse_rfc2253("CN=Fake root CA for tweetdeck.twitter.com")
cert.issuer = cert.subject
cert.not_before = Time.utc(2023, 8, 22)
cert.not_after = Time.utc(2035, 8, 22)
cert.public_key = key
ef = OpenSSL::X509::ExtensionFactory.new
ef.subject_certificate = ef.issuer_certificate = cert
cert.add_extension(ef.create_extension("basicConstraints", "CA:TRUE", true))
cert.add_extension(ef.create_extension("keyUsage", "digitalSignature,keyCertSign,cRLSign", true))
cert.add_extension(ef.create_extension("subjectKeyIdentifier", "hash", false))
cert.sign(key, "sha256")
File.write("ca_cert.pem", cert.to_pem)
File.write("ca_key.pem", key.to_pem)
[cert, key]
end
def setup_ee(ca_cert, ca_key)
key = OpenSSL::PKey::EC.generate("prime256v1")
cert = OpenSSL::X509::Certificate.new
cert.version = 2
cert.serial = OpenSSL::Random.random_bytes(16).unpack1("H*").to_i(16)
cert.subject = OpenSSL::X509::Name.parse_rfc2253("CN=Fake EE for tweetdeck.twitter.com")
cert.issuer = ca_cert.subject
cert.not_before = Time.utc(2023, 8, 22)
cert.not_after = Time.utc(2035, 8, 22)
cert.public_key = key
ef = OpenSSL::X509::ExtensionFactory.new
ef.subject_certificate = ef.issuer_certificate = cert
cert.add_extension(ef.create_extension("basicConstraints", "CA:FALSE", false))
cert.add_extension(ef.create_extension("keyUsage", "digitalSignature", true))
cert.add_extension(ef.create_extension("extendedKeyUsage", "serverAuth", true))
cert.add_extension(ef.create_extension("subjectAltName", "DNS:tweetdeck.twitter.com", false))
cert.add_extension(ef.create_extension("subjectKeyIdentifier", "hash", false))
cert.add_extension(ef.create_extension("authorityKeyIdentifier", "keyid:always", false))
cert.sign(ca_key, "sha256")
File.write("ee_cert.pem", cert.to_pem)
File.write("ee_key.pem", key.to_pem)
[cert, key]
end
if File.exist?("cert.pem")
warn "certificate already exists?"
exit 1
end
arg = setup_ca
setup_ee(*arg)
require "webrick"
require "webrick/https"
require "openssl"
srv = WEBrick::HTTPServer.new({
:ServerName => "tweetdeck.twitter.com",
:SSLEnable => true,
:SSLCertificate => OpenSSL::X509::Certificate.new(File.read("ee_cert.pem")),
:SSLPrivateKey => OpenSSL::PKey.read(File.read("ee_key.pem")),
:SSLExtraChainCert => [OpenSSL::X509::Certificate.new(File.read("ca_cert.pem"))],
:BindAddress => '127.0.0.1',
:Port => 443,
})
srv.mount_proc("/") do |req, res|
res.body = File.read("index.html")
end
srv.start
@rhenium
Copy link
Author

rhenium commented Aug 22, 2023

cache.rhe.jp の nginx においてみた

openssl s_client -connect cache.rhe.jp:443 -servername tweetdeck.twitter.com -showcerts
# ふたつめの PEM ブロックが CA 証明書
echo '45.148.172.134 tweetdeck.twitter.com' | sudo tee -a /etc/hosts

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment