#!/usr/bin/env ruby require 'json' require 'time' require 'openssl' require 'base64' require 'net/http' require 'uri' # document = { "a" => 2 } # .to_json document = { "@context": "https://www.w3.org/ns/activitystreams", "type": "Like", "actor": "https://example.net/~mallory", "to": ["https://hatchat.example/sarah/", "https://example.com/peeps/john/"], "object": { "@context": { "@language": "en" }, "id": "https://example.org/~alice/note/23", "type": "Note", "attributedTo": "https://example.org/~alice", "content": "I'm a goat" } } date = Time.now.utc.httpdate keypair = OpenSSL::PKey::RSA.new(File.read('private.pem')) signed_string = "(request-target): post /inbox\nhost: social.pdp8.info\ndate: #{date}" signed_string = keypair.sign(OpenSSL::Digest::SHA256.new, signed_string) signature = Base64.urlsafe_encode64(signed_string).encode("UTF-8") signed_header = 'keyId="https://social.pdp8.info/pdp8",headers="(request-target) host date",signature="' + signature + '"' uri = URI.parse("https://social.pdp8.info/inbox") http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_NONE header = { 'Accept' => 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"', 'Host' => 'social.pdp8.info', 'Date' => date, 'Signature' => signed_header, } request = Net::HTTP::Post.new(uri.request_uri, header) request.body = document.to_json response = http.request(request) puts(response.body, response.code)