Bài đăng nổi bật

Hướng dẫn thay đổi thư mục root mặc định của Docker trên Linux

Hoàn cảnh: người viết gặp một trường hợp như này Được team hạ tầng cấp cho một máy chủ gồm 2 phân vùng lưu trữ, 1 phân vùng 20GB được gắn và...

13 tháng 11, 2012

Sử dụng kết nối SSL/TLS trên java với các self-certificate

Vấn đề này tôi gặp phải khi viết một unitest cho kết nối imaps tới một server sử dụng self-certificate. Mọi nỗ lực kết nối tới server tôi đều gặp lỗi java phàn nàn về việc kết nối sử dụng một certificate không đáng tin - "untrusted certificate". Câu hỏi đặt ra ở đây là làm thế nào để ép java tiếp tục sử dụng kết nối này?
Nếu bạn để ý mỗi khi bạn dùng trình duyệt để kết nối tới một địa chỉ dạng https:// nào đó bạn có thể nhận được thông báo về việc đây là một kết nối không đáng tin, nếu bạn tin tưởng nó thì có thể thêm ngoại lệ này vào trình duyệt. Và đây cũng là ý tưởng để tôi giải quyết vấn đề này, đó là tôi cần phải tìm cách để java sẽ tự động thêm certificate này vào kho lưu trữ của mình hoặc đánh lừa java để nó luôn luôn tin tưởng vào certificate này.
Cách làm như sau:
  • Trước khi mở kết nối tôi cho java chạy qua hàm sau:
    private static void disableUntrustedComplain(){
            TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    public X509Certificate[] getAcceptedIssuers(){
                        return null;
                    }
                   
                    public void checkClientTrusted(X509Certificate[] certs, String authType){}
                   
                    public void checkServerTrusted(X509Certificate[] certs, String authType){}
                }
            };
            try{
                SSLContext sc = SSLContext.getInstance("TLS");//SSL nếu sử dụng mã hóa SSL.
                sc.init(null, trustAllCerts, new SecureRandom());
                SSLContext.setDefault(sc);
                System.out.println("disabled");
            }catch(Exception e){
                e.printStackTrace();
            }
        }
  •  Hàm này có tác dụng giúp java bỏ qua các complaining về untrusted certificate
  • Sau khi chạy hàm này chúng ta có thể thoải mái kết nối tới bất kỳ một kết nối nào sử dụng SSL/TLS.
Vui lòng xem thêm tại đây để tham khảo:http://abhinavasblog.blogspot.com/2011/07/allow-untrusted-certificate-for-https.html 
UPDATE:
    Gần đây tôi có làm việc với các kết nối liên quan tới giao thức XMPP (cụ thể là với Openfire) thì thấy cần phải sửa đoạn code trên một chút thì mới chạy được (Lưu ý là chỉ áp dụng với Openfire thôi nhé).
    Khi xử lý kết nối với Openfire sử dụng các self-certificate, mặc dù tôi sử dụng hàm ở phía trên nhưng vẫn bị dính lỗi PKIX không tin tưởng certificate. Để xử lý lỗi này tôi làm như sau:
Khi khởi tạo kết nối tới server XMPP tôi thêm thông tin cấu hình như sau:
SSLContext sc = disableUntrustedComplain();
        ConnectionConfiguration cc = new ConnectionConfiguration("mydomain.com", 5222);
        cc.setCustomSSLContext(sc);
        XMPPConnection connection = new XMPPTCPConnection(cc);
Trong đó có một số điểm lưu ý:
  • Hàm disableUntrustedComplain tôi trả về một giá trị thay vì sử dụng void như ở trên.
    Hàm này nội dung sẽ như sau:
    private static SSLContext disableUntrustedComplain(){
            SSLContext sc = null;
            TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {

                    @Override
                    public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException {
                    }

                    @Override
                    public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException {

                    }

                    @Override
                    public X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }
                }
            };
            //install the all-trusting trust manager
            try {
                sc = SSLContext.getInstance("TLS");//TLS or SSL
                sc.init(null, trustAllCerts, new SecureRandom());
                HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
                SSLContext.setDefault(sc);
                System.out.println("disable");
            } catch(NoSuchAlgorithmException naex){
                naex.printStackTrace();
            }catch(KeyManagementException kmex){
                kmex.printStackTrace();
            }finally{
                return sc;
            }
        }

Các tham số mạng quan trọng trên Linux

Thực ra tôi không biết nên đặt tiêu đề cho bài viết này là gì cho hợp lý. Thôi thì cứ đặt tạm một cái tên, sau đó sẽ suy nghĩ sau này nên đặt lại như thế nào.

Bài viết này tôi sẽ giải thích cho các bạn một số tham số có liên quan tới mạng trên hệđiều hành Linux (ởđây tôi sẽ lấy vídụ vơi hệđiều hànhUbuntu.

1 - Tham số somaxconn

     Tham số này bạn có thể xem bằng lệnh: cat /proc/sys/net/core/somaxconn
    Giá trị mặc định của nó là 128
    Tham số này định nghĩa giá trị tối đa cho hàng đợi socket của hệ điều hành. Tức là với mỗi một kết nối thành công tới hệ thống thì tham số này sẽ tự động giảm đi 1 và ngược lại khi kết nối được giải phóng. Nếu số kết nối chiếm hết 128 thì các kết nối sau sẽ bị từ chối.
    Để thay đổi tham số này ta có 2 cách:
    Đổi tạm thời trong phiên làm việc hiện tại: echo 256 > /proc/sys/net/core/somaxconn
    Đổi tham số này vĩnh viễn: sysctl -w net.core.somaxconn=1024

2 - netdev_max_backlog:

    Định nghĩa số gói và hàng đợi tối đa được áp dụng cho các thiết bị non-NAPI được cache lại trong trường hợp kernel không kịp xử lý.
    Giá trị mặc định là 1000
    Để thay đổi tham số này ta có 2 cách:
    Đổi tạm thời trong phiên làm việc hiện tại: echo 256 > /proc/sys/net/core/netdev_max_backlog
    Đổi tham số này vĩnh viễn: sysctl -w net.core.netdev_max_backlog=1024

26 tháng 10, 2012

Các tiện ích của Postfix

Trong bài viết này tôi sẽ hướng dẫn những người quản trị hệ thống mail Postfix sử dụng một số tiện ích sẵn có của Postfix.
1 - Kiểm tra nội dung các thư đang nằm trong queue của Postfix.
  • Trong postfix, các hàng đợi bao gồm: Active, Deferred, defer, bounced,... Mỗi hàng đợi tương ứng với một thư mục trong thư mục Data của postfix.
  • Trong mỗi hàng đợi, các thư được lưu theo cấu trúc như sau:
    - Mỗi thư có một ID riêng.
    - Thư có ID bắt đầu bằng ký tự nào thì sẽ được phân bố trong thư mục có tên là kí tự đó. Ví dụ, thư có ID 000115A0B99 đang bị deffered sẽ nằm trong thư mục /deffered/0/
  • Để xem nôi dung của một thư trong hàng đợi ta làm như sau:
    Bằng quyền root ta chạy lệnh /opt/postfix/sbin/postcat -q /opt/postfix/spool/deferred/0/00115A0B99.
    Lưu ý đường dẫn thực tế tới các file có thể thay đổi tùy theo môi trường cài đặt của người dung.
2 - Xóa các thư chỉ định trong hàng đợi.
Lệnh:
mailq | grep Luat_xoa | awk '{print $1}' | tr -d'*' | sudo /opt/postfix/sbin/postsuper -d -
Lưu ý đường dẫn thực tế có thể thay đổi tùy theo môi trường cài đặt của người dùng.
Xin tham khảo thêm các tham số của lệnh mailq và postsuper để có những lệnh phù hơp.
3 - Đếm số lượng thư trong một hàng đợi
Lệnh:
find /var/spool/postfix/deferred -type f -print | wc -l
Trong đó:
  • deferred: là tên hàng đợi thư trong postfix.
  • find: lệnh tìm kiếm.
  • wc -l: đếm số dòng trong kết quả hiện ra của lệnh find.
4 - Xóa thư trong hàng đợi chỉ định:
Lệnh:
postsuper -d ALL tên_hàng_đợi
Hàng đợi có thể là: deferred, incoming, active, bounce,...
5 - Thay đổi thời gian thử lại thư không thể gửi được.
Ta điều chỉnh tham số bounce_queue_lifetime.
Đơn vị tính là d - day, h - hour, w - week, s - second, m - minute

17 tháng 10, 2012

Sử dụng applet trong Ubuntu

Bài này được tôi rút từ kinh nghiệm thực tế. Tôi đã thử sử dụng icedtea plugin nhưng có vẻ là không ăn thua. Tôi đã thử trên Firefox, chưa thử trên Chromium nhưng có thể vẫn đúng, bạn nên thử nếu có nhu cầu. Và bài viết này tôi sử dụng Ubuntu 12.04.
Bài toán đặt ra của tôi là:
  • Tôi có một applet tự viết muốn chạy trên firefox để test nhưng không được.
  • Ngoài ra tôi còn có nhu cầu hiển thị java console để có thể debug các lỗi trong applet tuy nhiên thử rất nhiều cách với Icedtea cũng đều không được.
Sau một hồi loay hoay thì tôi cũng tạo dựng được môi trường như ý muốn. Bạn có thể làm như sau
  • Mở terminal.
  • Thêm kho cho Ubuntu bằng lệnh:
    sudo add-apt-repository ppa:webupd8team/java
  • Cập nhật lại kho bằng lệnh:
    sudo apt-get update
  • Cài đặt java bằng lệnh:
  • do apt-get install oracle-java7-installer
Sau đó bạn mở Oracle Java 7 Plugin Control Panel lên, enable Java console để sử dụng.
Giờ bạn hãy thử mở một applet lên xem, bạn sẽ thấy màn hình console java quen thuộc của windows hiện lên.




21 tháng 9, 2012

Gửi file theo đường http upload bằng client

Đây là một vấn đề khá thú vị và người viết cũng đã từng đặt ra câu hỏi này từ lâu, đó là: ta có thể dùng một trình duyệt để upload một/nhiều file lên web qua đường http upload (qua các form), vậy có thể mô phỏng chức năng này trên client (không bằng trình duyệt mà là sử dụng các ứng dụng để upload file y như một trình duyệt). Cho tới tận bây giờ người viết mới có cơ hội để thử nghiệm. Câu trả lời là hoàn toàn được.
Tôi sử dụng bộ thư viện HttpComponent và lập trình bằng ngôn ngữ java.
Dưới đây là mã nguồn tôi trích xuất từ bộ unitest của tôi:
public class testUploadFile {
   
    static String url = "http://127.0.0.1:8080/web/convert/document.pdf";
    static String path = "/home/user/NOTICE.txt";
   
    public static void main(String[] args) throws Exception{
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
        reqEntity.addPart("string_field", new StringBody("field value"));
        FileBody bin = new FileBody(new File(path));
        reqEntity.addPart("attachment_field", bin);

        httpPost.setEntity(reqEntity);
        System.out.println("Sending request " + httpPost.getRequestLine());
        HttpResponse response = httpClient.execute(httpPost);
        HttpEntity resEntity = response.getEntity();

        if(resEntity != null){
            String page = EntityUtils.toString(resEntity);
            System.out.println("Page: " + page);
        }
    }
}
Trong đoạn mã trên bạn chú ý cho tôi các dòng được bôi màu xanh.
  • HttpMultipartMode.BROWSER_COMPATIBLE tôi chưa rõ được vì sao phải dùng tham số với giá trị như này thì mới có thể upload file lên được, nếu bạn dùng giá trị MultipartEntity thì có vẻ là không thể chạy được, ít ra là với phiên bản của thư viện tôi đang dùng.
  • FileBody: tôi dùng để lấy nội dung file cần gửi.
  • reqEntity.addPart: tôi dùng để đính nội dung file cần gửi vào request.
  • Ngoài ra với hàm addPart bạn có thể dùng để đính thêm nhiều thông tin nữa vào cho request để gửi lên server, thường là các tham số thêm.
  •  httpClient.execute: được dùng để gửi request lên server.
  • response.getEntity: được dùng để nhận response của server.
Nói chung với cách dùng này, ngoài việc bạn có thể gửi file lên server bạn có thể thực hiện được rất nhiều các chức năng khác nữa, như: gửi SOAP, gửi các request lấy nội dung file,....
Chúc bạn thành công.

Edit: Ngoài ra bạn có thể thêm header vào các request bằng cách thêm vào đoạn mã  sau:
 httpPost.setHeader(tên_tham_số, giá_trị);
Ví dụ:
token = "JSESSIONID=1csup075gbkbm; ZM_TEST=true; ZM_AUTH_TOKEN=0_e83a2b9e2617f747bae138454d4dee946814b924_69643d33363a34636639303538612d656339392d343061662d613234312d3933666539353230373963313b6578703d31333a313335313030373830393138313b747970653d363a7a696d6272613b"; 
httpPost.setHeader("Cookie", token);

18 tháng 9, 2012

Công cụ so sánh file và thư mục trên Linux (Ubuntu)

Trong quá trình làm project, tôi thường xuyên có nhu cầu chia nhánh và nhập các nhánh cho project do đó phát sinh nhu cầu làm thế nào để nhanh chóng tìm ra những thay đổi trong một project. Tôi có thể lấy ví dụ ra những câu hỏi sau đây:
  • Có những file mã nguồn nào trong project bị thay đổi? File nào bị xóa? File nào thêm mới.
  • Nội dung của những file bị thay đổi là gì
  • Các file bị thay đổi nằm ở đâu?
  • ....
Để trả lời cho câu hỏi này tôi chọn Meld một merge tool rất mạnh trên Linux. Bạn có thể download nó tại kho phần mềm của Linux hoặc trực tiếp từ địa chỉ http://meldmerge.org/.
Các chức năng chính của meld:
  • So sánh nội dung của 2 file.
  • So sánh nội dung của 2 thư mục
  • Xem nội dung thay đổi giữa 2 file.
  • Merge các thay đổi giữa file, thư mục,
  • ....
Dưới đây là một số hình ảnh của chương trình:


09 tháng 9, 2012

Chèn biểu tượng Yahoo online/offline vào Blog, Website

Để chèn biểu tượng Yahoo online/offline vào Blog hoặc Website, các bạn làm như sau:
Bạn copy đoạn mã sau vào blog/web (paste vào chỗ muốn hiển thị)

<a href="ymsgr:sendIM?Yahoo!ID"><img border="0" src="http://presence.msg.yahoo.com/online?u=Yahoo!ID&m=g&t=ImageNo&l=us" alt="click here to chat" /></a>

Trong đó:

"Yahoo!ID" là tên nick YM của bạn.

"Click here to chat" là dòng chữ hiện ra khi người khác rê chuột vào biểu tượng YM! của bạn, chỉnh sửa tùy thích.

"ImageNo" là kiểu hiện thị thông báo online hay offline, là 1 trong các kiểu 1,2,3, 6-> 16, như sau:

Kiểu 1, 2, 3



Kiểu 6



Kiểu 7



Kiểu 8



Kiểu 9



Kiểu 10



Kiểu 11



Kiểu 12



Kiểu 13



Kiểu 14



Kiểu 15



Kiểu 16





Nguồn http://thuthuatvietnam.com